io: handle empty vectored writes in simplex (#8353)

This commit is contained in:
Minh Vu
2026-08-10 12:19:30 +02:00
committed by GitHub
parent 43e6ef50e4
commit af93763009
2 changed files with 17 additions and 0 deletions
+4
View File
@@ -291,6 +291,10 @@ impl AsyncWrite for Sender {
return Poll::Ready(Err(IoError::new(IoErrorKind::BrokenPipe, CLOSED_ERROR_MSG)));
}
if bufs.iter().all(|buf| buf.is_empty()) {
return Poll::Ready(Ok(0));
}
let free = inner
.backpressure_boundary
.checked_sub(inner.buf.len())
+13
View File
@@ -354,3 +354,16 @@ async fn poll_write_vectored_3() {
let n = assert_ready!(tx.poll_write_vectored(&mut noop_context(), io_slices)).unwrap();
assert_eq!(n, 0);
}
/// The `Sender::poll_write_vectored` should return `Poll::Ready(Ok(0))`
/// if all the input buffers have zero length, even when the channel is full.
#[tokio::test]
async fn poll_write_vectored_4() {
let (mut tx, _rx) = simplex::new(1);
tx.write_all(&[1]).await.unwrap();
let io_slices = &[IoSlice::new(&[]), IoSlice::new(&[])];
tokio::pin!(tx);
let n = assert_ready!(tx.poll_write_vectored(&mut noop_context(), io_slices)).unwrap();
assert_eq!(n, 0);
}