de(seq): require size for sequence

This commit is contained in:
Matt Bilker
2018-07-10 15:48:28 +00:00
parent 065f5ad8e5
commit f2d3e8c3c5
2 changed files with 9 additions and 4 deletions

View File

@@ -244,10 +244,12 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
let size = self.data_buf.read_u32::<BigEndian>().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)
}

View File

@@ -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<usize>) -> 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;