diff options
Diffstat (limited to 'azalea-buf/src')
| -rwxr-xr-x | azalea-buf/src/read.rs | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/azalea-buf/src/read.rs b/azalea-buf/src/read.rs index b4b54917..78db7357 100755 --- a/azalea-buf/src/read.rs +++ b/azalea-buf/src/read.rs @@ -173,9 +173,8 @@ impl McBufReadable for UnsizedByteArray { impl<T: McBufReadable + Send> McBufReadable for Vec<T> { default fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { let length = u32::var_read_from(buf)? as usize; - // we don't set the capacity here so we can't get exploited into - // allocating a bunch - let mut contents = Vec::new(); + // we limit the capacity to not get exploited into allocating a bunch + let mut contents = Vec::with_capacity(usize::min(length, 65536)); for _ in 0..length { contents.push(T::read_from(buf)?); } @@ -186,7 +185,7 @@ impl<T: McBufReadable + Send> McBufReadable for Vec<T> { impl<K: McBufReadable + Send + Eq + Hash, V: McBufReadable + Send> McBufReadable for HashMap<K, V> { fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { let length = i32::var_read_from(buf)? as usize; - let mut contents = HashMap::new(); + let mut contents = HashMap::with_capacity(usize::min(length, 65536)); for _ in 0..length { contents.insert(K::read_from(buf)?, V::read_from(buf)?); } @@ -199,7 +198,7 @@ impl<K: McBufReadable + Send + Eq + Hash, V: McBufVarReadable + Send> McBufVarRe { fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { let length = i32::var_read_from(buf)? as usize; - let mut contents = HashMap::new(); + let mut contents = HashMap::with_capacity(usize::min(length, 65536)); for _ in 0..length { contents.insert(K::read_from(buf)?, V::var_read_from(buf)?); } @@ -253,7 +252,7 @@ impl McBufVarReadable for u16 { impl<T: McBufVarReadable> McBufVarReadable for Vec<T> { fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { let length = i32::var_read_from(buf)? as usize; - let mut contents = Vec::new(); + let mut contents = Vec::with_capacity(usize::min(length, 65536)); for _ in 0..length { contents.push(T::var_read_from(buf)?); } |
