From 25760609fa2801b8294d05eda96d0f1dc43fcdaa Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 5 Oct 2017 10:40:48 -0700 Subject: [PATCH] Avoid 0-length `IoVec` instances These are unsound on Windows (unfortunately) and will soon be disallowed due to carllerche/iovec#5 --- src/net/tcp.rs | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/net/tcp.rs b/src/net/tcp.rs index e9022fc65..e94f6fe5c 100644 --- a/src/net/tcp.rs +++ b/src/net/tcp.rs @@ -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]) };