diff --git a/src/buf/mod.rs b/src/buf/mod.rs index 587de2c7ee66132bc7e1ad9587e23b310ed287f8..b5cd568b447b5429b0f84d2d6054ed194c55fc2b 100644 --- a/src/buf/mod.rs +++ b/src/buf/mod.rs @@ -407,12 +407,13 @@ impl<'a> Sink for &'a mut Vec<u8> { self.clear(); let rem = buf.remaining(); - let cap = self.capacity(); // Ensure that the vec is big enough if rem > self.capacity() { - self.reserve(rem - cap); + // current length is 0, so reserve completely + self.reserve(rem); } + debug_assert!(rem <= self.capacity()); unsafe { { diff --git a/test/test_buf.rs b/test/test_buf.rs index bb5c0f5fb3fe3bf9005eec0ace98450d2c2d4ca1..f28d70ff0d00e200613315fb91c0991663565b0c 100644 --- a/test/test_buf.rs +++ b/test/test_buf.rs @@ -1,6 +1,7 @@ use bytes::{Buf}; use byteorder; use std::io::{Cursor}; +use std::vec::{Vec}; #[test] pub fn test_fresh_cursor_vec() { @@ -44,3 +45,15 @@ fn test_read_u16_buffer_underflow() { let mut buf = Cursor::new(b"\x21"); buf.read_u16::<byteorder::BigEndian>(); } + +#[test] +fn test_vec_sink_capacity() { + use bytes::Sink; + + let mut sink: Vec<u8> = Vec::new(); + sink.reserve(16); + assert!(sink.capacity() >= 16, "Capacity {} must be at least 16", sink.capacity()); + let mut source = Cursor::new(b"0123456789abcdef0123456789abcdef"); + sink.copy_from(&mut source); + assert!(sink.len() <= sink.capacity(), "Length {} must be less than or equal to capacity {}", sink.len(), sink.capacity()); +}