From 7ed78cef475137d3811b8a9e371fe4853ecdeb4c Mon Sep 17 00:00:00 2001 From: Dan Burkert <dan@danburkert.com> Date: Tue, 27 Jun 2017 11:23:29 -0700 Subject: [PATCH] Fix index-oob panic in Take::bytes (#138) The panic happens when `inner.bytes()` returns a slice smaller than the limit. --- src/buf/take.rs | 3 ++- tests/test_take.rs | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/test_take.rs diff --git a/src/buf/take.rs b/src/buf/take.rs index 53c2933..a0c8ed4 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 0000000..93e0c6c --- /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()); +} -- GitLab