From f2d3e8c3c5a4197040e87d69b5693efadecc0015 Mon Sep 17 00:00:00 2001 From: Matt Bilker Date: Tue, 10 Jul 2018 15:48:28 +0000 Subject: [PATCH] de(seq): require size for sequence --- src/de/mod.rs | 6 ++++-- src/de/seq.rs | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/de/mod.rs b/src/de/mod.rs index 449ad91..37facc3 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -244,10 +244,12 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { let size = self.data_buf.read_u32::().context(KbinErrorKind::ArrayLengthRead)?; debug!("Deserializer::deserialize_seq() => read array size: {}", size); + // Changes to `self.read_mode` must stay here as `next_element_seed` is not + // called past the length of the array to reset the read mode self.read_mode = ReadMode::Array; - let value = visitor.visit_seq(Seq::new(self, Some(size as usize)))?; - self.data_buf.realign_reads(None)?; + let value = visitor.visit_seq(Seq::new(self, size as usize))?; self.read_mode = ReadMode::Single; + self.data_buf.realign_reads(None)?; Ok(value) } diff --git a/src/de/seq.rs b/src/de/seq.rs index 0c0ee6a..c1e2f71 100644 --- a/src/de/seq.rs +++ b/src/de/seq.rs @@ -10,8 +10,9 @@ pub struct Seq<'a, 'de: 'a> { } impl<'de, 'a> Seq<'a, 'de> { - pub fn new(de: &'a mut Deserializer<'de>, len: Option) -> Self { - let len = len.unwrap_or(0); + pub fn new(de: &'a mut Deserializer<'de>, len: usize) -> Self { + trace!("Seq::new(len: {})", len); + Self { de, index: 0, @@ -27,6 +28,8 @@ impl<'de, 'a> SeqAccess<'de> for Seq<'a, 'de> { where T: DeserializeSeed<'de> { if self.index >= self.len { + trace!("Seq::next_element_seed() => out of bounds read, returning None"); + return Ok(None); } self.index += 1;