aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoe Wilm <joe@jwilm.com>2018-05-19 12:06:21 -0700
committerJoe Wilm <joe@jwilm.com>2018-06-02 09:56:50 -0700
commit5a11f8584317b6a949a1ff3a5b3a446766db0665 (patch)
treef4214850e5bb6b69870de7c510a03aa0db6116c3 /src
parentc61a912f6221a320ec4787cd883527b0e7f26a8e (diff)
downloadalacritty-5a11f8584317b6a949a1ff3a5b3a446766db0665.tar.gz
alacritty-5a11f8584317b6a949a1ff3a5b3a446766db0665.zip
Fix OOB index in grid::DisplayIter
When resizing prior to this patch, hidden rows in Storage were not having columns added along with everything else. This feels like a bit of tech debt, but the patch is simple enough that it won't be much extra to back out later when the underlying cause is addressed (see comments in code).
Diffstat (limited to 'src')
-rw-r--r--src/grid/mod.rs2
-rw-r--r--src/grid/storage.rs16
2 files changed, 17 insertions, 1 deletions
diff --git a/src/grid/mod.rs b/src/grid/mod.rs
index 0eea4201..9b36fcdf 100644
--- a/src/grid/mod.rs
+++ b/src/grid/mod.rs
@@ -244,7 +244,7 @@ impl<T: Copy + Clone> Grid<T> {
}
fn grow_cols(&mut self, cols: index::Column, template: &T) {
- for row in self.raw.iter_mut() {
+ for row in self.raw.iter_mut_raw() {
row.grow(cols, template);
}
diff --git a/src/grid/storage.rs b/src/grid/storage.rs
index cadd4e29..e7c1a307 100644
--- a/src/grid/storage.rs
+++ b/src/grid/storage.rs
@@ -12,6 +12,7 @@
/// implementation is provided. Anything from Vec that should be exposed must be
/// done so manually.
use std::ops::{Index, IndexMut};
+use std::slice;
use index::Line;
@@ -183,10 +184,25 @@ impl<T> Storage<T> {
self.inner.swap(a, b);
}
+ /// Iterator over *logical* entries in the storage
+ ///
+ /// This *does not* iterate over hidden entries.
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut { storage: self, index: 0 }
}
+ /// Iterate over *all* entries in the underlying buffer
+ ///
+ /// This includes hidden entries.
+ ///
+ /// XXX This suggests that Storage is a leaky abstraction. Ultimately, this
+ /// is needed because of the grow lines functionality implemented on
+ /// this type, and maybe that's where the leak is necessitating this
+ /// accessor.
+ pub fn iter_mut_raw<'a>(&'a mut self) -> slice::IterMut<'a, T> {
+ self.inner.iter_mut()
+ }
+
pub fn rotate(&mut self, count: isize) {
debug_assert!(count.abs() as usize <= self.inner.len());