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]) };