mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-17 00:00:11 +02:00
Avoid 0-length IoVec instances
These are unsound on Windows (unfortunately) and will soon be disallowed due to carllerche/iovec#5
This commit is contained in:
+36
-2
@@ -595,7 +595,31 @@ impl<'a> AsyncRead for &'a TcpStream {
|
||||
return Ok(Async::NotReady)
|
||||
}
|
||||
let r = unsafe {
|
||||
let mut bufs: [_; 16] = Default::default();
|
||||
// The `IoVec` type can't have a 0-length size, so we create a bunch
|
||||
// of dummy versions on the stack with 1 length which we'll quickly
|
||||
// overwrite.
|
||||
let mut b1: &mut [u8] = &mut [0];
|
||||
let mut b2: &mut [u8] = &mut [0];
|
||||
let mut b3: &mut [u8] = &mut [0];
|
||||
let mut b4: &mut [u8] = &mut [0];
|
||||
let mut b5: &mut [u8] = &mut [0];
|
||||
let mut b6: &mut [u8] = &mut [0];
|
||||
let mut b7: &mut [u8] = &mut [0];
|
||||
let mut b8: &mut [u8] = &mut [0];
|
||||
let mut b9: &mut [u8] = &mut [0];
|
||||
let mut b10: &mut [u8] = &mut [0];
|
||||
let mut b11: &mut [u8] = &mut [0];
|
||||
let mut b12: &mut [u8] = &mut [0];
|
||||
let mut b13: &mut [u8] = &mut [0];
|
||||
let mut b14: &mut [u8] = &mut [0];
|
||||
let mut b15: &mut [u8] = &mut [0];
|
||||
let mut b16: &mut [u8] = &mut [0];
|
||||
let mut bufs: [&mut IoVec; 16] = [
|
||||
b1.into(), b2.into(), b3.into(), b4.into(),
|
||||
b5.into(), b6.into(), b7.into(), b8.into(),
|
||||
b9.into(), b10.into(), b11.into(), b12.into(),
|
||||
b13.into(), b14.into(), b15.into(), b16.into(),
|
||||
];
|
||||
let n = buf.bytes_vec_mut(&mut bufs);
|
||||
self.io.get_ref().read_bufs(&mut bufs[..n])
|
||||
};
|
||||
@@ -624,7 +648,17 @@ impl<'a> AsyncWrite for &'a TcpStream {
|
||||
return Ok(Async::NotReady)
|
||||
}
|
||||
let r = {
|
||||
let mut bufs: [_; 16] = Default::default();
|
||||
// The `IoVec` type can't have a zero-length size, so create a dummy
|
||||
// version from a 1-length slice which we'll overwrite with the
|
||||
// `bytes_vec` method.
|
||||
static DUMMY: &[u8] = &[0];
|
||||
let iovec = <&IoVec>::from(DUMMY);
|
||||
let mut bufs = [
|
||||
iovec, iovec, iovec, iovec,
|
||||
iovec, iovec, iovec, iovec,
|
||||
iovec, iovec, iovec, iovec,
|
||||
iovec, iovec, iovec, iovec,
|
||||
];
|
||||
let n = buf.bytes_vec(&mut bufs);
|
||||
self.io.get_ref().write_bufs(&bufs[..n])
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user