Fix backward invalid_length messages in value deserializer

This commit is contained in:
David Tolnay 2017-01-21 14:38:33 -08:00
parent 3c88a93fb2
commit 5855078703
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -43,9 +43,10 @@ use std::error;
use error; use error;
use core::fmt::{self, Display}; use core::fmt::{self, Display};
use core::iter::{self, Iterator};
use core::marker::PhantomData; use core::marker::PhantomData;
use de::{self, SeqVisitor}; use de::{self, Expected, SeqVisitor};
use bytes; use bytes;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -378,22 +379,37 @@ impl<'a, E> de::EnumVisitor for CowStrDeserializer<'a, E>
/// A helper deserializer that deserializes a sequence. /// A helper deserializer that deserializes a sequence.
pub struct SeqDeserializer<I, E> { pub struct SeqDeserializer<I, E> {
iter: I, iter: iter::Fuse<I>,
len: usize, count: usize,
marker: PhantomData<E>, marker: PhantomData<E>,
} }
impl<I, E> SeqDeserializer<I, E> impl<I, E> SeqDeserializer<I, E>
where E: de::Error, where I: Iterator,
E: de::Error,
{ {
/// Construct a new `SeqDeserializer<I>`. /// Construct a new `SeqDeserializer<I>`.
pub fn new(iter: I, len: usize) -> Self { pub fn new(iter: I) -> Self {
SeqDeserializer { SeqDeserializer {
iter: iter, iter: iter.fuse(),
len: len, count: 0,
marker: PhantomData, marker: PhantomData,
} }
} }
fn end(&mut self) -> Result<(), E> {
let mut remaining = 0;
while self.iter.next().is_some() {
remaining += 1;
}
if remaining == 0 {
Ok(())
} else {
// First argument is the number of elements in the data, second
// argument is the number of elements expected by the Deserialize.
Err(de::Error::invalid_length(self.count + remaining, &ExpectedInSeq(self.count)))
}
}
} }
impl<I, T, E> de::Deserializer for SeqDeserializer<I, E> impl<I, T, E> de::Deserializer for SeqDeserializer<I, E>
@ -407,11 +423,8 @@ impl<I, T, E> de::Deserializer for SeqDeserializer<I, E>
where V: de::Visitor, where V: de::Visitor,
{ {
let v = try!(visitor.visit_seq(&mut self)); let v = try!(visitor.visit_seq(&mut self));
if self.len == 0 { try!(self.end());
Ok(v) Ok(v)
} else {
Err(de::Error::invalid_length(self.len, &"TODO"))
}
} }
forward_to_deserialize! { forward_to_deserialize! {
@ -433,7 +446,7 @@ impl<I, T, E> de::SeqVisitor for SeqDeserializer<I, E>
{ {
match self.iter.next() { match self.iter.next() {
Some(value) => { Some(value) => {
self.len -= 1; self.count += 1;
seed.deserialize(value.into_deserializer()).map(Some) seed.deserialize(value.into_deserializer()).map(Some)
} }
None => Ok(None), None => Ok(None),
@ -441,7 +454,19 @@ impl<I, T, E> de::SeqVisitor for SeqDeserializer<I, E>
} }
fn size_hint(&self) -> (usize, Option<usize>) { fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len)) self.iter.size_hint()
}
}
struct ExpectedInSeq(usize);
impl Expected for ExpectedInSeq {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
if self.0 == 1 {
write!(formatter, "1 element in sequence")
} else {
write!(formatter, "{} elements in sequence", self.0)
}
} }
} }
@ -455,8 +480,7 @@ impl<T, E> ValueDeserializer<E> for Vec<T>
type Deserializer = SeqDeserializer<vec::IntoIter<T>, E>; type Deserializer = SeqDeserializer<vec::IntoIter<T>, E>;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
let len = self.len(); SeqDeserializer::new(self.into_iter())
SeqDeserializer::new(self.into_iter(), len)
} }
} }
@ -468,8 +492,7 @@ impl<T, E> ValueDeserializer<E> for BTreeSet<T>
type Deserializer = SeqDeserializer<btree_set::IntoIter<T>, E>; type Deserializer = SeqDeserializer<btree_set::IntoIter<T>, E>;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
let len = self.len(); SeqDeserializer::new(self.into_iter())
SeqDeserializer::new(self.into_iter(), len)
} }
} }
@ -481,8 +504,7 @@ impl<T, E> ValueDeserializer<E> for HashSet<T>
type Deserializer = SeqDeserializer<hash_set::IntoIter<T>, E>; type Deserializer = SeqDeserializer<hash_set::IntoIter<T>, E>;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
let len = self.len(); SeqDeserializer::new(self.into_iter())
SeqDeserializer::new(self.into_iter(), len)
} }
} }
@ -527,66 +549,66 @@ impl<V_, E> de::Deserializer for SeqVisitorDeserializer<V_, E>
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// A helper deserializer that deserializes a map. /// A helper deserializer that deserializes a map.
pub struct MapDeserializer<I, K, V, E> pub struct MapDeserializer<I, E>
where I: Iterator<Item=(K, V)>, where I: Iterator,
K: ValueDeserializer<E>, I::Item: private::Pair,
V: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
iter: I, iter: iter::Fuse<I>,
value: Option<V>, value: Option<<I::Item as private::Pair>::Second>,
len: Option<usize>, count: usize,
marker: PhantomData<E>, marker: PhantomData<E>,
} }
impl<I, K, V, E> MapDeserializer<I, K, V, E> impl<I, E> MapDeserializer<I, E>
where I: Iterator<Item=(K, V)>, where I: Iterator,
K: ValueDeserializer<E>, I::Item: private::Pair,
V: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
/// Construct a new `MapDeserializer<I, K, V, E>` with a specific length. /// Construct a new `MapDeserializer<I, K, V, E>`.
pub fn new(iter: I, len: usize) -> Self { pub fn new(iter: I) -> Self {
MapDeserializer { MapDeserializer {
iter: iter, iter: iter.fuse(),
value: None, value: None,
len: Some(len), count: 0,
marker: PhantomData, marker: PhantomData,
} }
} }
/// Construct a new `MapDeserializer<I, K, V, E>` that is not bounded fn next(&mut self) -> Option<(<I::Item as private::Pair>::First, <I::Item as private::Pair>::Second)> {
/// by a specific length and that delegates to `iter` for its size hint. match self.iter.next() {
pub fn unbounded(iter: I) -> Self { Some(kv) => {
MapDeserializer { self.count += 1;
iter: iter, Some(private::Pair::split(kv))
value: None,
len: None,
marker: PhantomData,
}
}
fn next(&mut self) -> Option<(K, V)> {
self.iter.next().map(|(k, v)| {
if let Some(len) = self.len.as_mut() {
*len -= 1;
} }
(k, v) None => None,
}) }
} }
fn end(&mut self) -> Result<(), E> { fn end(&mut self) -> Result<(), E> {
match self.len { let mut remaining = 0;
Some(len) if len > 0 => Err(de::Error::invalid_length(len, &"TODO")), while self.iter.next().is_some() {
_ => Ok(()) remaining += 1;
}
if remaining == 0 {
Ok(())
} else {
// First argument is the number of elements in the data, second
// argument is the number of elements expected by the Deserialize.
Err(de::Error::invalid_length(self.count + remaining, &ExpectedInMap(self.count)))
} }
} }
} }
impl<I, K, V, E> de::Deserializer for MapDeserializer<I, K, V, E> impl<I, E> de::Deserializer for MapDeserializer<I, E>
where I: Iterator<Item=(K, V)>, where I: Iterator,
K: ValueDeserializer<E>, I::Item: private::Pair,
V: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
type Error = E; type Error = E;
@ -607,17 +629,10 @@ impl<I, K, V, E> de::Deserializer for MapDeserializer<I, K, V, E>
Ok(value) Ok(value)
} }
fn deserialize_seq_fixed_size<V_>(mut self, len: usize, visitor: V_) -> Result<V_::Value, Self::Error> fn deserialize_seq_fixed_size<V_>(self, _len: usize, visitor: V_) -> Result<V_::Value, Self::Error>
where V_: de::Visitor, where V_: de::Visitor,
{ {
match self.len { self.deserialize_seq(visitor)
Some(map_len) if map_len != len => Err(de::Error::invalid_length(len, &"TODO")),
_ => {
let value = try!(visitor.visit_seq(&mut self));
try!(self.end());
Ok(value)
}
}
} }
forward_to_deserialize! { forward_to_deserialize! {
@ -627,10 +642,11 @@ impl<I, K, V, E> de::Deserializer for MapDeserializer<I, K, V, E>
} }
} }
impl<I, K, V, E> de::MapVisitor for MapDeserializer<I, K, V, E> impl<I, E> de::MapVisitor for MapDeserializer<I, E>
where I: Iterator<Item=(K, V)>, where I: Iterator,
K: ValueDeserializer<E>, I::Item: private::Pair,
V: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
type Error = E; type Error = E;
@ -672,16 +688,15 @@ impl<I, K, V, E> de::MapVisitor for MapDeserializer<I, K, V, E>
} }
fn size_hint(&self) -> (usize, Option<usize>) { fn size_hint(&self) -> (usize, Option<usize>) {
self.len.map_or_else( self.iter.size_hint()
|| self.iter.size_hint(),
|len| (len, Some(len)))
} }
} }
impl<I, K, V, E> de::SeqVisitor for MapDeserializer<I, K, V, E> impl<I, E> de::SeqVisitor for MapDeserializer<I, E>
where I: Iterator<Item=(K, V)>, where I: Iterator,
K: ValueDeserializer<E>, I::Item: private::Pair,
V: ValueDeserializer<E>, <I::Item as private::Pair>::First: ValueDeserializer<E>,
<I::Item as private::Pair>::Second: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
type Error = E; type Error = E;
@ -699,7 +714,7 @@ impl<I, K, V, E> de::SeqVisitor for MapDeserializer<I, K, V, E>
} }
fn size_hint(&self) -> (usize, Option<usize>) { fn size_hint(&self) -> (usize, Option<usize>) {
de::MapVisitor::size_hint(self) self.iter.size_hint()
} }
} }
@ -734,7 +749,10 @@ impl<A, B, E> de::Deserializer for PairDeserializer<A, B, E>
if pair_visitor.1.is_none() { if pair_visitor.1.is_none() {
Ok(pair) Ok(pair)
} else { } else {
Err(de::Error::invalid_length(pair_visitor.size_hint().0, &"TODO")) let remaining = pair_visitor.size_hint().0;
// First argument is the number of elements in the data, second
// argument is the number of elements expected by the Deserialize.
Err(de::Error::invalid_length(2, &ExpectedInSeq(2 - remaining)))
} }
} }
@ -744,7 +762,9 @@ impl<A, B, E> de::Deserializer for PairDeserializer<A, B, E>
if len == 2 { if len == 2 {
self.deserialize_seq(visitor) self.deserialize_seq(visitor)
} else { } else {
Err(de::Error::invalid_length(len, &"TODO")) // First argument is the number of elements in the data, second
// argument is the number of elements expected by the Deserialize.
Err(de::Error::invalid_length(2, &ExpectedInSeq(len)))
} }
} }
} }
@ -782,6 +802,18 @@ impl<A, B, E> de::SeqVisitor for PairVisitor<A, B, E>
} }
} }
struct ExpectedInMap(usize);
impl Expected for ExpectedInMap {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
if self.0 == 1 {
write!(formatter, "1 element in map")
} else {
write!(formatter, "{} elements in map", self.0)
}
}
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#[cfg(any(feature = "std", feature = "collections"))] #[cfg(any(feature = "std", feature = "collections"))]
@ -790,11 +822,10 @@ impl<K, V, E> ValueDeserializer<E> for BTreeMap<K, V>
V: ValueDeserializer<E>, V: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
type Deserializer = MapDeserializer<btree_map::IntoIter<K, V>, K, V, E>; type Deserializer = MapDeserializer<btree_map::IntoIter<K, V>, E>;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
let len = self.len(); MapDeserializer::new(self.into_iter())
MapDeserializer::new(self.into_iter(), len)
} }
} }
@ -804,11 +835,10 @@ impl<K, V, E> ValueDeserializer<E> for HashMap<K, V>
V: ValueDeserializer<E>, V: ValueDeserializer<E>,
E: de::Error, E: de::Error,
{ {
type Deserializer = MapDeserializer<hash_map::IntoIter<K, V>, K, V, E>; type Deserializer = MapDeserializer<hash_map::IntoIter<K, V>, E>;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
let len = self.len(); MapDeserializer::new(self.into_iter())
MapDeserializer::new(self.into_iter(), len)
} }
} }
@ -962,4 +992,18 @@ mod private {
Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant")) Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant"))
} }
} }
/// Avoid having to restate the generic types on MapDeserializer. The
/// Iterator::Item contains enough information to figure out K and V.
pub trait Pair {
type First;
type Second;
fn split(self) -> (Self::First, Self::Second);
}
impl<A, B> Pair for (A, B) {
type First = A;
type Second = B;
fn split(self) -> (A, B) { self }
}
} }