From 05d1936caf0bc718606c790a3cb60aaf78139d99 Mon Sep 17 00:00:00 2001 From: slyrz Date: Thu, 9 Mar 2017 20:04:51 +0100 Subject: [PATCH] Make read_vec more robust (#134) * Make read_vec more robust * Remove check for overflowing add * Let the two read_vec functions become one again --- src/serde/reader.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/serde/reader.rs b/src/serde/reader.rs index 8c29e28..7c1c545 100644 --- a/src/serde/reader.rs +++ b/src/serde/reader.rs @@ -1,3 +1,4 @@ +use std::cmp; use std::io::Read; use std::marker::PhantomData; @@ -8,6 +9,8 @@ use serde_crate::de::Error as DeError; use ::SizeLimit; use super::{Result, Error, ErrorKind}; +const BLOCK_SIZE: usize = 65536; + /// A Deserializer that reads bytes from a buffer. /// /// This struct should rarely be used. @@ -58,11 +61,20 @@ impl Deserializer { let len = try!(serde::Deserialize::deserialize(&mut *self)); try!(self.read_bytes(len)); - let len = len as usize; - let mut bytes = Vec::with_capacity(len); - unsafe { bytes.set_len(len); } - try!(self.reader.read_exact(&mut bytes)); - Ok(bytes) + let mut result = Vec::new(); + let mut len = len as usize; + let mut off = 0; + while len > 0 { + let reserve = cmp::min(len, BLOCK_SIZE); + unsafe { + result.reserve(reserve); + result.set_len(off + reserve); + } + try!(self.reader.read_exact(&mut result[off..])); + len -= reserve; + off += reserve; + } + Ok(result) } fn read_string(&mut self) -> Result {