diff --git a/src/buf/take.rs b/src/buf/take.rs index 53c2933e9b1477754d0f242325c5c610fa11ce33..a0c8ed479e1717666822b26ddd676b1bd93b2fec 100644 --- a/src/buf/take.rs +++ b/src/buf/take.rs @@ -143,7 +143,8 @@ impl<T: Buf> Buf for Take<T> { } fn bytes(&self) -> &[u8] { - &self.inner.bytes()[..self.limit] + let bytes = self.inner.bytes(); + &bytes[..cmp::min(bytes.len(), self.limit)] } fn advance(&mut self, cnt: usize) { diff --git a/tests/test_take.rs b/tests/test_take.rs new file mode 100644 index 0000000000000000000000000000000000000000..93e0c6c5ab8a14eeb6bd4a4f6ab5705f3d8e950c --- /dev/null +++ b/tests/test_take.rs @@ -0,0 +1,13 @@ +extern crate bytes; + +use bytes::Buf; +use std::io::Cursor; + +#[test] +fn long_take() { + // Tests that take with a size greater than the buffer length will not + // overrun the buffer. Regression test for #138. + let buf = Cursor::new(b"hello world").take(100); + assert_eq!(11, buf.remaining()); + assert_eq!(b"hello world", buf.bytes()); +}