From 5a11f8584317b6a949a1ff3a5b3a446766db0665 Mon Sep 17 00:00:00 2001 From: Joe Wilm Date: Sat, 19 May 2018 12:06:21 -0700 Subject: [PATCH] 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). --- src/grid/mod.rs | 2 +- src/grid/storage.rs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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 Grid { } 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 Storage { 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 { 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());