From 05553c7eb85be1781100d4a8259c208eba093293 Mon Sep 17 00:00:00 2001 From: Zettroke Date: Sat, 27 Feb 2021 15:33:59 +0300 Subject: [PATCH 1/5] fix chain remaining_mut() allowing to chain growing buffer --- src/buf/chain.rs | 3 +-- tests/test_chain.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/buf/chain.rs b/src/buf/chain.rs index 8a1598ccf..7b614d1d6 100644 --- a/src/buf/chain.rs +++ b/src/buf/chain.rs @@ -180,8 +180,7 @@ where fn remaining_mut(&self) -> usize { self.a .remaining_mut() - .checked_add(self.b.remaining_mut()) - .unwrap() + .saturating_add(self.b.remaining_mut()) } fn chunk_mut(&mut self) -> &mut UninitSlice { diff --git a/tests/test_chain.rs b/tests/test_chain.rs index 500ccd4a8..0416f5c9d 100644 --- a/tests/test_chain.rs +++ b/tests/test_chain.rs @@ -132,3 +132,16 @@ fn vectored_read() { assert_eq!(iovecs[3][..], b""[..]); } } + +#[test] +fn chain_growing_buffer() { + let mut buff = [' ' as u8; 10]; + let mut vec = b"wassup".to_vec(); + + let mut chained = (&mut buff[..]).chain_mut(&mut vec); + + chained.put_slice(b"hey there123123"); + + assert_eq!(&buff, b"hey there1"); + assert_eq!(&vec, b"wassup23123"); +} \ No newline at end of file From 834db77eb7f0e2efed8c9366ca21fedc37b7b8d2 Mon Sep 17 00:00:00 2001 From: Zettroke Date: Sat, 27 Feb 2021 15:56:27 +0300 Subject: [PATCH 2/5] fix rustfmt --- tests/test_chain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_chain.rs b/tests/test_chain.rs index 0416f5c9d..8a48b26a1 100644 --- a/tests/test_chain.rs +++ b/tests/test_chain.rs @@ -144,4 +144,4 @@ fn chain_growing_buffer() { assert_eq!(&buff, b"hey there1"); assert_eq!(&vec, b"wassup23123"); -} \ No newline at end of file +} From 08ea84efba6f8dbd795e5c85c53e360f31f87331 Mon Sep 17 00:00:00 2001 From: Zettroke Date: Thu, 29 Apr 2021 23:04:43 +0300 Subject: [PATCH 3/5] Update test_chain.rs --- tests/test_chain.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_chain.rs b/tests/test_chain.rs index 867ff553c..d06e85ff6 100644 --- a/tests/test_chain.rs +++ b/tests/test_chain.rs @@ -166,4 +166,3 @@ fn chain_get_bytes() { // assert `get_bytes` did not allocate assert_eq!(cd_ptr.wrapping_offset(1), d.as_ptr()); } -} From 9d976d0507e26158f0645bd121fe6f7bb363814f Mon Sep 17 00:00:00 2001 From: Zettroke Date: Sat, 7 Aug 2021 13:06:28 +0300 Subject: [PATCH 4/5] Fix chain_mut test and add overflow test + docs --- src/buf/buf_mut.rs | 4 ++++ tests/test_chain.rs | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index bf33fe635..aef6a4e1b 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -56,6 +56,10 @@ pub unsafe trait BufMut { /// Implementations of `remaining_mut` should ensure that the return value /// does not change unless a call is made to `advance_mut` or any other /// function that is documented to change the `BufMut`'s current position. + /// + /// # Note + /// + /// `remaining_mut` may return value smaller than actual available space. fn remaining_mut(&self) -> usize; /// Advance the internal cursor of the BufMut diff --git a/tests/test_chain.rs b/tests/test_chain.rs index d06e85ff6..f4371beaf 100644 --- a/tests/test_chain.rs +++ b/tests/test_chain.rs @@ -138,7 +138,9 @@ fn chain_growing_buffer() { let mut buff = [' ' as u8; 10]; let mut vec = b"wassup".to_vec(); - let mut chained = (&mut buff[..]).chain_mut(&mut vec); + let mut chained = (&mut buff[..]) + .chain_mut(&mut vec) + .chain_mut(Vec::new()); // Required for potential overflow because remaining_mut for Vec is isize::MAX - vec.len(), but for chain_mut is usize::MAX chained.put_slice(b"hey there123123"); @@ -146,6 +148,17 @@ fn chain_growing_buffer() { assert_eq!(&vec, b"wassup23123"); } +#[test] +fn chain_overflow_remaining_mut() { + let mut chained = Vec::::new() + .chain_mut(Vec::new()) + .chain_mut(Vec::new()); + + assert_eq!(chained.remaining_mut(), usize::MAX); + chained.put_slice(&[0; 256]); + assert_eq!(chained.remaining_mut(), usize::MAX); +} + #[test] fn chain_get_bytes() { let mut ab = Bytes::copy_from_slice(b"ab"); From b380d18555963f6d9e36954bc5a7bb4ab74f2b84 Mon Sep 17 00:00:00 2001 From: Zettroke Date: Sat, 7 Aug 2021 13:09:16 +0300 Subject: [PATCH 5/5] fmt --- tests/test_chain.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/test_chain.rs b/tests/test_chain.rs index f4371beaf..cfda6b8dc 100644 --- a/tests/test_chain.rs +++ b/tests/test_chain.rs @@ -138,9 +138,7 @@ fn chain_growing_buffer() { let mut buff = [' ' as u8; 10]; let mut vec = b"wassup".to_vec(); - let mut chained = (&mut buff[..]) - .chain_mut(&mut vec) - .chain_mut(Vec::new()); // Required for potential overflow because remaining_mut for Vec is isize::MAX - vec.len(), but for chain_mut is usize::MAX + let mut chained = (&mut buff[..]).chain_mut(&mut vec).chain_mut(Vec::new()); // Required for potential overflow because remaining_mut for Vec is isize::MAX - vec.len(), but for chain_mut is usize::MAX chained.put_slice(b"hey there123123"); @@ -150,9 +148,7 @@ fn chain_growing_buffer() { #[test] fn chain_overflow_remaining_mut() { - let mut chained = Vec::::new() - .chain_mut(Vec::new()) - .chain_mut(Vec::new()); + let mut chained = Vec::::new().chain_mut(Vec::new()).chain_mut(Vec::new()); assert_eq!(chained.remaining_mut(), usize::MAX); chained.put_slice(&[0; 256]);