mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-07 00:00:08 +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)
|
return Ok(Async::NotReady)
|
||||||
}
|
}
|
||||||
let r = unsafe {
|
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);
|
let n = buf.bytes_vec_mut(&mut bufs);
|
||||||
self.io.get_ref().read_bufs(&mut bufs[..n])
|
self.io.get_ref().read_bufs(&mut bufs[..n])
|
||||||
};
|
};
|
||||||
@@ -624,7 +648,17 @@ impl<'a> AsyncWrite for &'a TcpStream {
|
|||||||
return Ok(Async::NotReady)
|
return Ok(Async::NotReady)
|
||||||
}
|
}
|
||||||
let r = {
|
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);
|
let n = buf.bytes_vec(&mut bufs);
|
||||||
self.io.get_ref().write_bufs(&bufs[..n])
|
self.io.get_ref().write_bufs(&bufs[..n])
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user