aboutsummaryrefslogtreecommitdiff
path: root/src/bytes_mut.rs
diff options
context:
space:
mode:
authorGravatar Carl Lerche <me@carllerche.com> 2020-10-19 15:48:23 -0700
committerGravatar GitHub <noreply@github.com> 2020-10-19 15:48:23 -0700
commite0d8413d53e3774177b040a4f9adda40ec15ce8f (patch)
tree96c2caf27aa9a19127baa414dd3470d20b49d4ee /src/bytes_mut.rs
parent5a11c783ecf7c308e7b145f56d5c05e635b99269 (diff)
downloadbytes-e0d8413d53e3774177b040a4f9adda40ec15ce8f.tar.gz
bytes-e0d8413d53e3774177b040a4f9adda40ec15ce8f.tar.zst
bytes-e0d8413d53e3774177b040a4f9adda40ec15ce8f.zip
Switch `BufMut::bytes_mut` to`&mut UninitSlice` (#433)
The way BufMut uses MaybeUninit can lead to unsoundness. This replaces MaybeUnit with a type owned by bytes so we can ensure the usage patterns are sound. Refs: #328
Diffstat (limited to 'src/bytes_mut.rs')
-rw-r--r--src/bytes_mut.rs12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs
index 16cb72c..38f1ed5 100644
--- a/src/bytes_mut.rs
+++ b/src/bytes_mut.rs
@@ -11,7 +11,7 @@ use alloc::{
vec::Vec,
};
-use crate::buf::IntoIter;
+use crate::buf::{IntoIter, UninitSlice};
use crate::bytes::Vtable;
#[allow(unused)]
use crate::loom::sync::atomic::AtomicMut;
@@ -684,7 +684,7 @@ impl BytesMut {
self.reserve(cnt);
unsafe {
- let dst = self.maybe_uninit_bytes();
+ let dst = self.uninit_slice();
// Reserved above
debug_assert!(dst.len() >= cnt);
@@ -910,12 +910,12 @@ impl BytesMut {
}
#[inline]
- fn maybe_uninit_bytes(&mut self) -> &mut [mem::MaybeUninit<u8>] {
+ fn uninit_slice(&mut self) -> &mut UninitSlice {
unsafe {
let ptr = self.ptr.as_ptr().offset(self.len as isize);
let len = self.cap - self.len;
- slice::from_raw_parts_mut(ptr as *mut mem::MaybeUninit<u8>, len)
+ UninitSlice::from_raw_parts_mut(ptr, len)
}
}
}
@@ -985,11 +985,11 @@ unsafe impl BufMut for BytesMut {
}
#[inline]
- fn bytes_mut(&mut self) -> &mut [mem::MaybeUninit<u8>] {
+ fn bytes_mut(&mut self) -> &mut UninitSlice {
if self.capacity() == self.len() {
self.reserve(64);
}
- self.maybe_uninit_bytes()
+ self.uninit_slice()
}
// Specialize these methods so they can skip checking `remaining_mut`