Don't poll handle if closed, prevents panic if child wait finishes before all bytes are read

This commit is contained in:
asonix 2023-12-22 13:20:21 -06:00
parent b94ba5fcfc
commit 0dbe722524

View file

@ -370,22 +370,20 @@ impl AsyncRead for ProcessRead {
} else { } else {
break Poll::Ready(Ok(())); break Poll::Ready(Ok(()));
} }
} else if self.closed {
// Stop if we're closed
break Poll::Ready(Ok(()));
} else if let Some(waker) = self.get_waker(HANDLE_WAKER) { } else if let Some(waker) = self.get_waker(HANDLE_WAKER) {
// only poll handle if we've been explicitly woken // only poll handle if we've been explicitly woken
let mut handle_cx = Context::from_waker(&waker); let mut handle_cx = Context::from_waker(&waker);
if let Poll::Ready(res) = Pin::new(&mut self.handle).poll(&mut handle_cx) { if let Poll::Ready(res) = Pin::new(&mut self.handle).poll(&mut handle_cx) {
let error = match res {
Ok(()) => continue,
Err(e) => e,
};
self.closed = true; self.closed = true;
break Poll::Ready(Err(error));
if let Err(e) = res {
break Poll::Ready(Err(e));
}
} }
} else if self.closed {
// Stop if we're closed
break Poll::Ready(Ok(()));
} else if self.set_parent_waker(cx.waker()) { } else if self.set_parent_waker(cx.waker()) {
// if we updated the stored waker, mark all as woken an try polling again // if we updated the stored waker, mark all as woken an try polling again
// This doesn't actually "wake" the waker, it just allows the handle to be polled // This doesn't actually "wake" the waker, it just allows the handle to be polled