summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaiki Endo <te316e89@gmail.com>2020-06-12 14:28:23 +0900
committerGitHub <noreply@github.com>2020-06-12 14:28:23 +0900
commit1769f65d37b81aa2fd9d68687c7ed9d82773ea80 (patch)
tree6c781716399614ee35e62e394f10744c850fa7d7
parent1636910f0a6bdb2084362be6b4daea70bcdceebc (diff)
io: fix unsound pin projection in read_buf and write_buf (#2612)
-rw-r--r--tokio/src/io/util/async_read_ext.rs2
-rw-r--r--tokio/src/io/util/async_write_ext.rs2
-rw-r--r--tokio/src/io/util/read_buf.rs13
-rw-r--r--tokio/src/io/util/write_buf.rs13
4 files changed, 12 insertions, 18 deletions
diff --git a/tokio/src/io/util/async_read_ext.rs b/tokio/src/io/util/async_read_ext.rs
index d4402db6..fcd2cce4 100644
--- a/tokio/src/io/util/async_read_ext.rs
+++ b/tokio/src/io/util/async_read_ext.rs
@@ -221,7 +221,7 @@ cfg_io_util! {
/// ```
fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
where
- Self: Sized,
+ Self: Sized + Unpin,
B: BufMut,
{
read_buf(self, buf)
diff --git a/tokio/src/io/util/async_write_ext.rs b/tokio/src/io/util/async_write_ext.rs
index 377f4eca..9c7ec7f7 100644
--- a/tokio/src/io/util/async_write_ext.rs
+++ b/tokio/src/io/util/async_write_ext.rs
@@ -180,7 +180,7 @@ cfg_io_util! {
/// ```
fn write_buf<'a, B>(&'a mut self, src: &'a mut B) -> WriteBuf<'a, Self, B>
where
- Self: Sized,
+ Self: Sized + Unpin,
B: Buf,
{
write_buf(self, src)
diff --git a/tokio/src/io/util/read_buf.rs b/tokio/src/io/util/read_buf.rs
index 550499b9..97e670de 100644
--- a/tokio/src/io/util/read_buf.rs
+++ b/tokio/src/io/util/read_buf.rs
@@ -8,7 +8,7 @@ use std::task::{Context, Poll};
pub(crate) fn read_buf<'a, R, B>(reader: &'a mut R, buf: &'a mut B) -> ReadBuf<'a, R, B>
where
- R: AsyncRead,
+ R: AsyncRead + Unpin,
B: BufMut,
{
ReadBuf { reader, buf }
@@ -26,16 +26,13 @@ cfg_io_util! {
impl<R, B> Future for ReadBuf<'_, R, B>
where
- R: AsyncRead,
+ R: AsyncRead + Unpin,
B: BufMut,
{
type Output = io::Result<usize>;
- fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
- // safety: no data is moved from self
- unsafe {
- let me = self.get_unchecked_mut();
- Pin::new_unchecked(&mut *me.reader).poll_read_buf(cx, &mut me.buf)
- }
+ fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
+ let me = &mut *self;
+ Pin::new(&mut *me.reader).poll_read_buf(cx, me.buf)
}
}
diff --git a/tokio/src/io/util/write_buf.rs b/tokio/src/io/util/write_buf.rs
index e49282fe..cedfde64 100644
--- a/tokio/src/io/util/write_buf.rs
+++ b/tokio/src/io/util/write_buf.rs
@@ -20,7 +20,7 @@ cfg_io_util! {
/// asynchronous manner, returning a future.
pub(crate) fn write_buf<'a, W, B>(writer: &'a mut W, buf: &'a mut B) -> WriteBuf<'a, W, B>
where
- W: AsyncWrite,
+ W: AsyncWrite + Unpin,
B: Buf,
{
WriteBuf { writer, buf }
@@ -28,16 +28,13 @@ where
impl<W, B> Future for WriteBuf<'_, W, B>
where
- W: AsyncWrite,
+ W: AsyncWrite + Unpin,
B: Buf,
{
type Output = io::Result<usize>;
- fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
- // safety: no data is moved from self
- unsafe {
- let me = self.get_unchecked_mut();
- Pin::new_unchecked(&mut *me.writer).poll_write_buf(cx, &mut me.buf)
- }
+ fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
+ let me = &mut *self;
+ Pin::new(&mut *me.writer).poll_write_buf(cx, me.buf)
}
}