Skip to content

Commit 0bbea2b

Browse files
committed
handling ERROR_MORE_DATA does not notify read event
1 parent d4111ba commit 0bbea2b

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/sys/windows/named_pipe.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -565,10 +565,9 @@ impl<'a> Read for &'a NamedPipe {
565565
Ok(n)
566566
}
567567

568-
// Schedule another read with a bigger buffer
569-
e @ State::InsufficientBufferSize(..) => {
570-
state.read = e;
571-
Inner::schedule_read(&self.inner, &mut state, None);
568+
// We scheduled another read with a bigger buffer after the first read (see `read_done`)
569+
// This is not possible in theory, just like `State::None` case, but return would block for now.
570+
State::InsufficientBufferSize(..) => {
572571
Err(would_block())
573572
}
574573

@@ -723,10 +722,11 @@ impl Inner {
723722
/// scheduled.
724723
fn schedule_read(me: &Arc<Inner>, io: &mut Io, events: Option<&mut Vec<Event>>) -> bool {
725724
// Check to see if a read is already scheduled/completed
725+
726726
let mut buf = match mem::replace(&mut io.read, State::None) {
727727
State::None => me.get_buffer(),
728728
State::InsufficientBufferSize(mut buf, rem) => {
729-
buf.reserve(rem);
729+
buf.reserve_exact(rem);
730730
buf
731731
}
732732
e @ _ => {
@@ -735,11 +735,12 @@ impl Inner {
735735
}
736736
};
737737

738+
738739
// Allocate a buffer and schedule the read.
739740
let e = unsafe {
740741
let overlapped = me.read.as_ptr() as *mut _;
741742
let slice = slice::from_raw_parts_mut(buf.as_mut_ptr(), buf.capacity());
742-
me.read_overlapped(slice, overlapped)
743+
me.read_overlapped(&mut slice[buf.len()..], overlapped)
743744
};
744745
match e {
745746
// See `NamedPipe::connect` above for the rationale behind `forget`
@@ -910,6 +911,8 @@ fn read_done(status: &OVERLAPPED_ENTRY, events: Option<&mut Vec<Event>>) {
910911
Ok(rem) => {
911912
buf.set_len(status.bytes_transferred() as usize);
912913
io.read = State::InsufficientBufferSize(buf, rem);
914+
Inner::schedule_read(&me, &mut io, None);
915+
return;
913916
}
914917
Err(e) => {
915918
io.read = State::Err(e);

0 commit comments

Comments
 (0)