Skip to content

Commit 43e3bae

Browse files
committed
add more checks
1 parent daa2379 commit 43e3bae

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/sys/windows/named_pipe.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ use crate::sys::windows::{Event, Handle, Overlapped};
2727
use crate::Registry;
2828
use crate::{Interest, Token};
2929

30+
const MAX_BUFFER_SZ: usize = 65536;
31+
3032
/// Non-blocking windows named pipe.
3133
///
3234
/// This structure internally contains a `HANDLE` which represents the named
@@ -731,7 +733,8 @@ impl Inner {
731733
let mut buf = match mem::replace(&mut io.read, State::None) {
732734
State::None => me.get_buffer(),
733735
State::InsufficientBufferSize(mut buf, rem) => {
734-
buf.reserve_exact(rem);
736+
let sz_rem = std::cmp::min(rem, MAX_BUFFER_SZ);
737+
buf.reserve_exact(sz_rem);
735738
buf
736739
}
737740
e @ _ => {
@@ -911,9 +914,12 @@ fn read_done(status: &OVERLAPPED_ENTRY, events: Option<&mut Vec<Event>>) {
911914
io.read = State::Ok(buf, 0);
912915
}
913916
Err(e) if e.raw_os_error() == Some(ERROR_MORE_DATA as i32) => {
917+
buf.set_len(status.bytes_transferred() as usize);
914918
match me.remaining_size() {
919+
Ok(rem) if rem == 0 => {
920+
io.read = State::Ok(buf, 0);
921+
}
915922
Ok(rem) => {
916-
buf.set_len(status.bytes_transferred() as usize);
917923
io.read = State::InsufficientBufferSize(buf, rem);
918924
Inner::schedule_read(&me, &mut io, None);
919925
return;

0 commit comments

Comments
 (0)