Respect size limits in read_seq and read_map.
This commit is contained in:
parent
a486ac6192
commit
1e21e5d13b
|
|
@ -129,7 +129,10 @@ impl<'a, R: Read> DecoderReader<'a, R> {
|
||||||
|
|
||||||
impl <'a, A> DecoderReader<'a, A> {
|
impl <'a, A> DecoderReader<'a, A> {
|
||||||
fn read_bytes(&mut self, count: u64) -> Result<(), DecodingError> {
|
fn read_bytes(&mut self, count: u64) -> Result<(), DecodingError> {
|
||||||
self.read += count;
|
self.read = match self.read.checked_add(count) {
|
||||||
|
Some(read) => read,
|
||||||
|
None => return Err(DecodingError::SizeLimit),
|
||||||
|
};
|
||||||
match self.size_limit {
|
match self.size_limit {
|
||||||
SizeLimit::Infinite => Ok(()),
|
SizeLimit::Infinite => Ok(()),
|
||||||
SizeLimit::Bounded(x) if self.read <= x => Ok(()),
|
SizeLimit::Bounded(x) if self.read <= x => Ok(()),
|
||||||
|
|
@ -342,6 +345,11 @@ impl<'a, R: Read> Decoder for DecoderReader<'a, R> {
|
||||||
where F: FnOnce(&mut DecoderReader<'a, R>, usize) -> DecodingResult<T>
|
where F: FnOnce(&mut DecoderReader<'a, R>, usize) -> DecodingResult<T>
|
||||||
{
|
{
|
||||||
let len = try!(self.read_usize());
|
let len = try!(self.read_usize());
|
||||||
|
match self.size_limit {
|
||||||
|
SizeLimit::Infinite => (),
|
||||||
|
SizeLimit::Bounded(x) if self.read.saturating_add(len as u64) <= x => (),
|
||||||
|
SizeLimit::Bounded(_) => return Err(DecodingError::SizeLimit),
|
||||||
|
};
|
||||||
f(self, len)
|
f(self, len)
|
||||||
}
|
}
|
||||||
fn read_seq_elt<T, F>(&mut self, _: usize, f: F) -> DecodingResult<T>
|
fn read_seq_elt<T, F>(&mut self, _: usize, f: F) -> DecodingResult<T>
|
||||||
|
|
@ -353,6 +361,11 @@ impl<'a, R: Read> Decoder for DecoderReader<'a, R> {
|
||||||
where F: FnOnce(&mut DecoderReader<'a, R>, usize) -> DecodingResult<T>
|
where F: FnOnce(&mut DecoderReader<'a, R>, usize) -> DecodingResult<T>
|
||||||
{
|
{
|
||||||
let len = try!(self.read_usize());
|
let len = try!(self.read_usize());
|
||||||
|
match self.size_limit {
|
||||||
|
SizeLimit::Infinite => (),
|
||||||
|
SizeLimit::Bounded(x) if self.read.saturating_add(len as u64) <= x => (),
|
||||||
|
SizeLimit::Bounded(_) => return Err(DecodingError::SizeLimit),
|
||||||
|
};
|
||||||
f(self, len)
|
f(self, len)
|
||||||
}
|
}
|
||||||
fn read_map_elt_key<T, F>(&mut self, _: usize, f: F) -> DecodingResult<T>
|
fn read_map_elt_key<T, F>(&mut self, _: usize, f: F) -> DecodingResult<T>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue