From 490b56705b114f118311621a1f4833fbcb07ea42 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Fri, 31 Mar 2023 13:29:18 +0200 Subject: [PATCH 01/19] unsafe impl<'a> BufMut for ReadBuf<'a> --- tokio/src/io/read_buf.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 0dc595a87dd..de84fa56eeb 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -1,5 +1,9 @@ use std::fmt; use std::mem::MaybeUninit; +use bytes::{ + BufMut, + buf::UninitSlice, +}; /// A wrapper around a byte buffer that is incrementally filled and initialized. /// @@ -270,6 +274,22 @@ impl<'a> ReadBuf<'a> { } } +unsafe impl<'a> BufMut for ReadBuf<'a> { + fn remaining_mut(&self) -> usize { + self.remaining() + } + + unsafe fn advance_mut(&mut self, cnt: usize) { + self.advance(cnt); + } + + fn chunk_mut(&mut self) -> &mut UninitSlice { + unsafe { + UninitSlice::from_raw_parts_mut(10 as *mut u8, 10) + } + } +} + impl fmt::Debug for ReadBuf<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("ReadBuf") From fc7e30bcc6d8af39036b15dbf9acf0bdb31551a7 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Fri, 31 Mar 2023 13:37:17 +0200 Subject: [PATCH 02/19] rustfmt --- tokio/src/io/read_buf.rs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index de84fa56eeb..8dbf743ef4d 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -1,9 +1,6 @@ +use bytes::{buf::UninitSlice, BufMut}; use std::fmt; use std::mem::MaybeUninit; -use bytes::{ - BufMut, - buf::UninitSlice, -}; /// A wrapper around a byte buffer that is incrementally filled and initialized. /// @@ -275,18 +272,16 @@ impl<'a> ReadBuf<'a> { } unsafe impl<'a> BufMut for ReadBuf<'a> { - fn remaining_mut(&self) -> usize { - self.remaining() + fn remaining_mut(&self) -> usize { + self.remaining() } - + unsafe fn advance_mut(&mut self, cnt: usize) { self.advance(cnt); } - + fn chunk_mut(&mut self) -> &mut UninitSlice { - unsafe { - UninitSlice::from_raw_parts_mut(10 as *mut u8, 10) - } + unsafe { UninitSlice::from_raw_parts_mut(10 as *mut u8, 10) } } } From bad061b152c79b9ff0180456456fabd3ab778222 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Fri, 31 Mar 2023 13:42:24 +0200 Subject: [PATCH 03/19] Add feature gate --- tokio/src/io/read_buf.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 8dbf743ef4d..b00118fed9e 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -1,4 +1,6 @@ +#[cfg(feature = "bytes")] use bytes::{buf::UninitSlice, BufMut}; + use std::fmt; use std::mem::MaybeUninit; @@ -271,6 +273,7 @@ impl<'a> ReadBuf<'a> { } } +#[cfg(feature = "bytes")] unsafe impl<'a> BufMut for ReadBuf<'a> { fn remaining_mut(&self) -> usize { self.remaining() From ec629ee1e54b428f0ca197d6840f78409e98d17b Mon Sep 17 00:00:00 2001 From: amab8901 Date: Fri, 31 Mar 2023 14:09:57 +0200 Subject: [PATCH 04/19] Add len to from_raw_parts_mut(ptr, len) --- tokio/src/io/read_buf.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index b00118fed9e..605fb1ccf64 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -284,7 +284,10 @@ unsafe impl<'a> BufMut for ReadBuf<'a> { } fn chunk_mut(&mut self) -> &mut UninitSlice { - unsafe { UninitSlice::from_raw_parts_mut(10 as *mut u8, 10) } + let ptr = 10 as *mut u8; // any ideas? + let len = self.filled().len(); + unsafe { UninitSlice::from_raw_parts_mut(ptr, len) } + } } From d56a3e20e055a04c060bed8a026a215adceef72f Mon Sep 17 00:00:00 2001 From: amab8901 Date: Fri, 31 Mar 2023 16:25:01 +0200 Subject: [PATCH 05/19] Fix chunk_mut --- tokio/src/io/read_buf.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 605fb1ccf64..d3d49a31e5a 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -284,10 +284,9 @@ unsafe impl<'a> BufMut for ReadBuf<'a> { } fn chunk_mut(&mut self) -> &mut UninitSlice { - let ptr = 10 as *mut u8; // any ideas? let len = self.filled().len(); - unsafe { UninitSlice::from_raw_parts_mut(ptr, len) } - + let ptr = unsafe { self.unfilled_mut().as_mut_ptr() }; + unsafe { UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) } } } From afe2501597e7447814f2a9990a8eb39dad491ffc Mon Sep 17 00:00:00 2001 From: amab8901 Date: Sat, 1 Apr 2023 18:35:13 +0200 Subject: [PATCH 06/19] Length of remaining part, not the filled part --- tokio/src/io/read_buf.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index d3d49a31e5a..b332f30fd2e 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -284,9 +284,11 @@ unsafe impl<'a> BufMut for ReadBuf<'a> { } fn chunk_mut(&mut self) -> &mut UninitSlice { - let len = self.filled().len(); - let ptr = unsafe { self.unfilled_mut().as_mut_ptr() }; - unsafe { UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) } + unsafe { + let len = self.unfilled_mut().len(); + let ptr = self.unfilled_mut().as_mut_ptr(); + UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) + } } } From 214226e25cdc0ce074aba7527fd32605585b55ab Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 11:07:52 +0200 Subject: [PATCH 07/19] Apply feedback --- tokio/src/io/read_buf.rs | 12 +++++------- tokio/tests/io_read_buf.rs | 39 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index b332f30fd2e..b11caa48904 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -1,6 +1,3 @@ -#[cfg(feature = "bytes")] -use bytes::{buf::UninitSlice, BufMut}; - use std::fmt; use std::mem::MaybeUninit; @@ -273,8 +270,9 @@ impl<'a> ReadBuf<'a> { } } -#[cfg(feature = "bytes")] -unsafe impl<'a> BufMut for ReadBuf<'a> { +#[cfg(feature = "io-util")] +#[cfg_attr(docsrs, doc(cfg(feature = "io-util")))] +unsafe impl<'a> bytes::BufMut for ReadBuf<'a> { fn remaining_mut(&self) -> usize { self.remaining() } @@ -283,11 +281,11 @@ unsafe impl<'a> BufMut for ReadBuf<'a> { self.advance(cnt); } - fn chunk_mut(&mut self) -> &mut UninitSlice { + fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice { unsafe { let len = self.unfilled_mut().len(); let ptr = self.unfilled_mut().as_mut_ptr(); - UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) + bytes::buf::UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) } } } diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 0328168d7ab..62ee7c9527e 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -34,3 +34,42 @@ async fn read_buf() { assert_eq!(n, 11); assert_eq!(buf[..], b"hello world"[..]); } + +#[tokio::test] +#[cfg(feature = "io-util")] +#[cfg_attr(docsrs, doc(cfg(feature = "io-util")))] +async fn issue_5588() { + use bytes::BufMut; + + // steps to zero + let mut buf = [0; 8]; + let mut read_buf = ReadBuf::new(&mut buf); + assert_eq!(read_buf.remaining_mut(), 8); + assert_eq!(read_buf.remaining_mut(), 8); + unsafe { + read_buf.advance_mut(1); + } + assert_eq!(read_buf.remaining_mut(), 7); + assert_eq!(read_buf.remaining_mut(), 7); + unsafe { + read_buf.advance_mut(5); + } + assert_eq!(read_buf.remaining_mut(), 2); + assert_eq!(read_buf.remaining_mut(), 2); + unsafe { + read_buf.advance_mut(2); + } + assert_eq!(read_buf.remaining_mut(), 0); + assert_eq!(read_buf.remaining_mut(), 0); + + // directly to zero + let mut buf = [0; 8]; + let mut read_buf = ReadBuf::new(&mut buf); + assert_eq!(read_buf.remaining_mut(), 8); + assert_eq!(read_buf.chunk_mut().len(), 8); + unsafe { + read_buf.advance_mut(8); + } + assert_eq!(read_buf.remaining_mut(), 0); + assert_eq!(read_buf.chunk_mut().len(), 0); +} \ No newline at end of file From 8a94073ac37cc466181da9cfb2145db453cc7521 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 11:12:10 +0200 Subject: [PATCH 08/19] Apply feedback --- tokio/tests/io_read_buf.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 62ee7c9527e..2e43dd55bab 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -72,4 +72,4 @@ async fn issue_5588() { } assert_eq!(read_buf.remaining_mut(), 0); assert_eq!(read_buf.chunk_mut().len(), 0); -} \ No newline at end of file +} From 7ea22e5be1fef2c3355f7e671b861e84de229ee4 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 11:15:32 +0200 Subject: [PATCH 09/19] remove docs from test --- tokio/tests/io_read_buf.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 2e43dd55bab..275057b64fd 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -37,7 +37,6 @@ async fn read_buf() { #[tokio::test] #[cfg(feature = "io-util")] -#[cfg_attr(docsrs, doc(cfg(feature = "io-util")))] async fn issue_5588() { use bytes::BufMut; From c3cf522e5f1e49e6b863f172e336e7740f94c2d4 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 12:00:02 +0200 Subject: [PATCH 10/19] Isolate unsafety, add comments --- tokio/src/io/read_buf.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index b11caa48904..3210bde6021 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -282,10 +282,17 @@ unsafe impl<'a> bytes::BufMut for ReadBuf<'a> { } fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice { + // SAFETY: No region of `unfilled` will be deinitialized because it is + // exposed as an `UninitSlice`, whose API guarantees that the memory is + // never deinitialized. + let unfilled = unsafe { self.unfilled_mut() }; + let len = unfilled.len(); + let ptr = unfilled.as_mut_ptr() as *mut u8; + + // SAFETY: The pointer is valid for `len` bytes because it comes from a + // slice of that length. unsafe { - let len = self.unfilled_mut().len(); - let ptr = self.unfilled_mut().as_mut_ptr(); - bytes::buf::UninitSlice::from_raw_parts_mut(ptr as *mut u8, len) + bytes::buf::UninitSlice::from_raw_parts_mut(ptr, len) } } } From 5cdd398e0c4115722568cd4b2c8c3642c476d756 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 12:25:26 +0200 Subject: [PATCH 11/19] fmt --- tokio/src/io/read_buf.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 3210bde6021..85041ccefa1 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -288,12 +288,10 @@ unsafe impl<'a> bytes::BufMut for ReadBuf<'a> { let unfilled = unsafe { self.unfilled_mut() }; let len = unfilled.len(); let ptr = unfilled.as_mut_ptr() as *mut u8; - + // SAFETY: The pointer is valid for `len` bytes because it comes from a // slice of that length. - unsafe { - bytes::buf::UninitSlice::from_raw_parts_mut(ptr, len) - } + unsafe { bytes::buf::UninitSlice::from_raw_parts_mut(ptr, len) } } } From a1af08ed9a140928b4b91d82e18a70978d9d7c27 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 13:22:44 +0200 Subject: [PATCH 12/19] improve test --- tokio/tests/io_read_buf.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 275057b64fd..4672c6892e7 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -44,22 +44,22 @@ async fn issue_5588() { let mut buf = [0; 8]; let mut read_buf = ReadBuf::new(&mut buf); assert_eq!(read_buf.remaining_mut(), 8); - assert_eq!(read_buf.remaining_mut(), 8); + assert_eq!(read_buf.chunk_mut().len(), 8); unsafe { read_buf.advance_mut(1); } assert_eq!(read_buf.remaining_mut(), 7); - assert_eq!(read_buf.remaining_mut(), 7); + assert_eq!(read_buf.chunk_mut().len(), 7); unsafe { read_buf.advance_mut(5); } assert_eq!(read_buf.remaining_mut(), 2); - assert_eq!(read_buf.remaining_mut(), 2); + assert_eq!(read_buf.chunk_mut().len(), 2); unsafe { read_buf.advance_mut(2); } assert_eq!(read_buf.remaining_mut(), 0); - assert_eq!(read_buf.remaining_mut(), 0); + assert_eq!(read_buf.chunk_mut().len(), 0); // directly to zero let mut buf = [0; 8]; @@ -71,4 +71,10 @@ async fn issue_5588() { } assert_eq!(read_buf.remaining_mut(), 0); assert_eq!(read_buf.chunk_mut().len(), 0); + + // uninit + let mut buf = [std::mem::MaybeUninit::new(1); 8]; + let mut uninit = ReadBuf::uninit(&mut buf); + assert_eq!(read_buf.remaining_mut(), 0); + assert_eq!(uninit.chunk_mut().len(), 8); } From 43fe36b8efd357ac6040a61d18ce14e58e2897e9 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 15:17:51 +0200 Subject: [PATCH 13/19] debug uninit.advance_mut(1000000) --- tokio/src/io/read_buf.rs | 4 +++- tokio/tests/io_read_buf.rs | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 85041ccefa1..2fe2f8e1ade 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -278,7 +278,9 @@ unsafe impl<'a> bytes::BufMut for ReadBuf<'a> { } unsafe fn advance_mut(&mut self, cnt: usize) { - self.advance(cnt); + if self.initialized > 0 { + self.advance(cnt); + } } fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice { diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 4672c6892e7..6657e2d9be2 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -71,10 +71,14 @@ async fn issue_5588() { } assert_eq!(read_buf.remaining_mut(), 0); assert_eq!(read_buf.chunk_mut().len(), 0); - + // uninit let mut buf = [std::mem::MaybeUninit::new(1); 8]; let mut uninit = ReadBuf::uninit(&mut buf); - assert_eq!(read_buf.remaining_mut(), 0); + assert_eq!(uninit.remaining_mut(), 8); assert_eq!(uninit.chunk_mut().len(), 8); + + let mut buf = [std::mem::MaybeUninit::uninit(); 8]; + let mut uninit = ReadBuf::uninit(&mut buf); + unsafe { uninit.advance_mut(100000); } // should be effectively no-op } From 90762ac79de8e52fac1ba6233b8344c30f12c0f0 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 15:19:01 +0200 Subject: [PATCH 14/19] fmt --- tokio/tests/io_read_buf.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 6657e2d9be2..41b745bc3e8 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -71,14 +71,16 @@ async fn issue_5588() { } assert_eq!(read_buf.remaining_mut(), 0); assert_eq!(read_buf.chunk_mut().len(), 0); - + // uninit let mut buf = [std::mem::MaybeUninit::new(1); 8]; let mut uninit = ReadBuf::uninit(&mut buf); assert_eq!(uninit.remaining_mut(), 8); assert_eq!(uninit.chunk_mut().len(), 8); - + let mut buf = [std::mem::MaybeUninit::uninit(); 8]; let mut uninit = ReadBuf::uninit(&mut buf); - unsafe { uninit.advance_mut(100000); } // should be effectively no-op + unsafe { + uninit.advance_mut(100000); + } // should be effectively no-op } From 65682946fa595b019e96bea7e56dfb5cefc5e613 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 15:25:33 +0200 Subject: [PATCH 15/19] Add remaining_mut() and check_mut().len() to uninit test --- tokio/tests/io_read_buf.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 41b745bc3e8..cc95ae322e7 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -83,4 +83,7 @@ async fn issue_5588() { unsafe { uninit.advance_mut(100000); } // should be effectively no-op + assert_eq!(uninit.remaining_mut(), 8); + assert_eq!(uninit.chunk_mut().len(), 8); + } From e8e58f1789328a7df037cef069fcd73c5919d32c Mon Sep 17 00:00:00 2001 From: amab8901 Date: Mon, 3 Apr 2023 15:44:32 +0200 Subject: [PATCH 16/19] fmt --- tokio/tests/io_read_buf.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index cc95ae322e7..c7edd4d83a4 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -85,5 +85,4 @@ async fn issue_5588() { } // should be effectively no-op assert_eq!(uninit.remaining_mut(), 8); assert_eq!(uninit.chunk_mut().len(), 8); - } From 6c264c2b4147e52d077f299bf73f468839491e4e Mon Sep 17 00:00:00 2001 From: amab8901 Date: Tue, 4 Apr 2023 05:24:37 +0200 Subject: [PATCH 17/19] Improve advance_mut --- tokio/src/io/read_buf.rs | 6 +++--- tokio/tests/io_read_buf.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tokio/src/io/read_buf.rs b/tokio/src/io/read_buf.rs index 2fe2f8e1ade..283d96e3095 100644 --- a/tokio/src/io/read_buf.rs +++ b/tokio/src/io/read_buf.rs @@ -277,10 +277,10 @@ unsafe impl<'a> bytes::BufMut for ReadBuf<'a> { self.remaining() } + // SAFETY: The caller guarantees that at least `cnt` unfilled bytes have been initialized. unsafe fn advance_mut(&mut self, cnt: usize) { - if self.initialized > 0 { - self.advance(cnt); - } + self.assume_init(cnt); + self.advance(cnt); } fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice { diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index c7edd4d83a4..d3e8b426bd5 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -82,7 +82,7 @@ async fn issue_5588() { let mut uninit = ReadBuf::uninit(&mut buf); unsafe { uninit.advance_mut(100000); - } // should be effectively no-op + } assert_eq!(uninit.remaining_mut(), 8); assert_eq!(uninit.chunk_mut().len(), 8); } From 93c360c0d11ed00eb462f17e2c3a8a3bbe7bdce6 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Tue, 4 Apr 2023 05:47:17 +0200 Subject: [PATCH 18/19] Pass the test --- tokio/tests/io_read_buf.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index d3e8b426bd5..42d933d48f5 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -81,8 +81,8 @@ async fn issue_5588() { let mut buf = [std::mem::MaybeUninit::uninit(); 8]; let mut uninit = ReadBuf::uninit(&mut buf); unsafe { - uninit.advance_mut(100000); + uninit.advance_mut(8); } - assert_eq!(uninit.remaining_mut(), 8); - assert_eq!(uninit.chunk_mut().len(), 8); + assert_eq!(uninit.remaining_mut(), 0); + assert_eq!(uninit.chunk_mut().len(), 0); } From a1d66843301dde7888aa2b1af13c88b9b7680487 Mon Sep 17 00:00:00 2001 From: amab8901 Date: Tue, 4 Apr 2023 16:09:54 +0200 Subject: [PATCH 19/19] Add write to test --- tokio/tests/io_read_buf.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tokio/tests/io_read_buf.rs b/tokio/tests/io_read_buf.rs index 42d933d48f5..49a4f86f8ad 100644 --- a/tokio/tests/io_read_buf.rs +++ b/tokio/tests/io_read_buf.rs @@ -81,8 +81,14 @@ async fn issue_5588() { let mut buf = [std::mem::MaybeUninit::uninit(); 8]; let mut uninit = ReadBuf::uninit(&mut buf); unsafe { - uninit.advance_mut(8); + uninit.advance_mut(4); } + assert_eq!(uninit.remaining_mut(), 4); + assert_eq!(uninit.chunk_mut().len(), 4); + uninit.put_u8(1); + assert_eq!(uninit.remaining_mut(), 3); + assert_eq!(uninit.chunk_mut().len(), 3); + uninit.put_slice(&[1, 2, 3]); assert_eq!(uninit.remaining_mut(), 0); assert_eq!(uninit.chunk_mut().len(), 0); }