@@ -762,8 +762,10 @@ impl<W: Write> Write for LineWriter<W> {
762
762
match memchr:: memrchr ( b'\n' , buf) {
763
763
Some ( i) => {
764
764
let n = try!( self . inner . write ( & buf[ ..i + 1 ] ) ) ;
765
- if n != i + 1 { return Ok ( n) }
766
- try!( self . inner . flush ( ) ) ;
765
+ if n != i + 1 || self . inner . flush ( ) . is_err ( ) {
766
+ // Do not return errors on partial writes.
767
+ return Ok ( n) ;
768
+ }
767
769
self . inner . write ( & buf[ i + 1 ..] ) . map ( |i| n + i)
768
770
}
769
771
None => self . inner . write ( buf) ,
@@ -982,6 +984,34 @@ mod tests {
982
984
assert_eq ! ( v, [ ] ) ;
983
985
}
984
986
987
+ #[ test]
988
+ fn test_line_buffer_fail_flush ( ) {
989
+ // Issue #32085
990
+ struct FailFlushWriter < ' a > ( & ' a mut Vec < u8 > ) ;
991
+
992
+ impl < ' a > Write for FailFlushWriter < ' a > {
993
+ fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
994
+ self . 0 . extend_from_slice ( buf) ;
995
+ Ok ( buf. len ( ) )
996
+ }
997
+ fn flush ( & mut self ) -> io:: Result < ( ) > {
998
+ Err ( io:: Error :: new ( io:: ErrorKind :: Other , "flush failed" ) )
999
+ }
1000
+ }
1001
+
1002
+ let mut buf = Vec :: new ( ) ;
1003
+ {
1004
+ let mut writer = LineWriter :: new ( FailFlushWriter ( & mut buf) ) ;
1005
+ let to_write = b"abc\n def" ;
1006
+ if let Ok ( written) = writer. write ( to_write) {
1007
+ assert ! ( written < to_write. len( ) , "didn't flush on new line" ) ;
1008
+ // PASS
1009
+ return ;
1010
+ }
1011
+ }
1012
+ assert ! ( buf. is_empty( ) , "write returned an error but wrote data" ) ;
1013
+ }
1014
+
985
1015
#[ test]
986
1016
fn test_line_buffer ( ) {
987
1017
let mut writer = LineWriter :: new ( Vec :: new ( ) ) ;
0 commit comments