@@ -27,6 +27,8 @@ use crate::sys::windows::{Event, Handle, Overlapped};
27
27
use crate :: Registry ;
28
28
use crate :: { Interest , Token } ;
29
29
30
+ const MAX_BUFFER_SZ : usize = 65536 ;
31
+
30
32
/// Non-blocking windows named pipe.
31
33
///
32
34
/// This structure internally contains a `HANDLE` which represents the named
@@ -731,7 +733,8 @@ impl Inner {
731
733
let mut buf = match mem:: replace ( & mut io. read , State :: None ) {
732
734
State :: None => me. get_buffer ( ) ,
733
735
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) ;
735
738
buf
736
739
}
737
740
e @ _ => {
@@ -911,9 +914,12 @@ fn read_done(status: &OVERLAPPED_ENTRY, events: Option<&mut Vec<Event>>) {
911
914
io. read = State :: Ok ( buf, 0 ) ;
912
915
}
913
916
Err ( e) if e. raw_os_error ( ) == Some ( ERROR_MORE_DATA as i32 ) => {
917
+ buf. set_len ( status. bytes_transferred ( ) as usize ) ;
914
918
match me. remaining_size ( ) {
919
+ Ok ( rem) if rem == 0 => {
920
+ io. read = State :: Ok ( buf, 0 ) ;
921
+ }
915
922
Ok ( rem) => {
916
- buf. set_len ( status. bytes_transferred ( ) as usize ) ;
917
923
io. read = State :: InsufficientBufferSize ( buf, rem) ;
918
924
Inner :: schedule_read ( & me, & mut io, None ) ;
919
925
return ;
0 commit comments