mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-25 00:00:18 +02:00
io: report error on zero-write in write_int (#2334)
* tokio-io: make write_i* same behavior as write_all when poll_write returns Ok(0) Fixes: #2329 Co-authored-by: lishuo <[email protected]>
This commit is contained in:
@@ -56,6 +56,9 @@ macro_rules! writer {
|
||||
{
|
||||
Poll::Pending => return Poll::Pending,
|
||||
Poll::Ready(Err(e)) => return Poll::Ready(Err(e.into())),
|
||||
Poll::Ready(Ok(0)) => {
|
||||
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
|
||||
}
|
||||
Poll::Ready(Ok(n)) => n as u8,
|
||||
};
|
||||
}
|
||||
@@ -96,7 +99,7 @@ macro_rules! writer8 {
|
||||
match me.dst.poll_write(cx, &buf[..]) {
|
||||
Poll::Pending => Poll::Pending,
|
||||
Poll::Ready(Err(e)) => Poll::Ready(Err(e.into())),
|
||||
Poll::Ready(Ok(0)) => Poll::Pending,
|
||||
Poll::Ready(Ok(0)) => Poll::Ready(Err(io::ErrorKind::WriteZero.into())),
|
||||
Poll::Ready(Ok(1)) => Poll::Ready(Ok(())),
|
||||
Poll::Ready(Ok(_)) => unreachable!(),
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
#![warn(rust_2018_idioms)]
|
||||
#![cfg(feature = "full")]
|
||||
|
||||
use tokio::io::{AsyncWrite, AsyncWriteExt};
|
||||
|
||||
use std::io;
|
||||
use std::pin::Pin;
|
||||
use std::task::{Context, Poll};
|
||||
|
||||
#[tokio::test]
|
||||
async fn write_int_should_err_if_write_count_0() {
|
||||
struct Wr {}
|
||||
|
||||
impl AsyncWrite for Wr {
|
||||
fn poll_write(
|
||||
self: Pin<&mut Self>,
|
||||
_cx: &mut Context<'_>,
|
||||
_buf: &[u8],
|
||||
) -> Poll<io::Result<usize>> {
|
||||
Ok(0).into()
|
||||
}
|
||||
|
||||
fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
||||
Ok(()).into()
|
||||
}
|
||||
|
||||
fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
||||
Ok(()).into()
|
||||
}
|
||||
}
|
||||
|
||||
let mut wr = Wr {};
|
||||
|
||||
// should be ok just to test these 2, other cases actually expanded by same macro.
|
||||
assert!(wr.write_i8(0).await.is_err());
|
||||
assert!(wr.write_i32(12).await.is_err());
|
||||
}
|
||||
Reference in New Issue
Block a user