@@ -193,6 +193,13 @@ impl<R> BufReader<R> {
193
193
/// ```
194
194
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
195
195
pub fn into_inner ( self ) -> R { self . inner }
196
+
197
+ /// Invalidates all data in the internal buffer.
198
+ #[ inline]
199
+ fn discard_buffer ( & mut self ) {
200
+ self . pos = 0 ;
201
+ self . cap = 0 ;
202
+ }
196
203
}
197
204
198
205
impl < R : Seek > BufReader < R > {
@@ -227,6 +234,7 @@ impl<R: Read> Read for BufReader<R> {
227
234
// (larger than our internal buffer), bypass our internal buffer
228
235
// entirely.
229
236
if self . pos == self . cap && buf. len ( ) >= self . buf . len ( ) {
237
+ self . discard_buffer ( ) ;
230
238
return self . inner . read ( buf) ;
231
239
}
232
240
let nread = {
@@ -240,6 +248,7 @@ impl<R: Read> Read for BufReader<R> {
240
248
fn read_vectored ( & mut self , bufs : & mut [ IoVecMut < ' _ > ] ) -> io:: Result < usize > {
241
249
let total_len = bufs. iter ( ) . map ( |b| b. len ( ) ) . sum :: < usize > ( ) ;
242
250
if self . pos == self . cap && total_len >= self . buf . len ( ) {
251
+ self . discard_buffer ( ) ;
243
252
return self . inner . read_vectored ( bufs) ;
244
253
}
245
254
let nread = {
@@ -325,14 +334,14 @@ impl<R: Seek> Seek for BufReader<R> {
325
334
} else {
326
335
// seek backwards by our remainder, and then by the offset
327
336
self . inner . seek ( SeekFrom :: Current ( -remainder) ) ?;
328
- self . pos = self . cap ; // empty the buffer
337
+ self . discard_buffer ( ) ;
329
338
result = self . inner . seek ( SeekFrom :: Current ( n) ) ?;
330
339
}
331
340
} else {
332
341
// Seeking with Start/End doesn't care about our buffer length.
333
342
result = self . inner . seek ( pos) ?;
334
343
}
335
- self . pos = self . cap ; // empty the buffer
344
+ self . discard_buffer ( ) ;
336
345
Ok ( result)
337
346
}
338
347
}
@@ -1068,6 +1077,40 @@ mod tests {
1068
1077
assert_eq ! ( reader. fill_buf( ) . ok( ) , Some ( & [ 2 , 3 ] [ ..] ) ) ;
1069
1078
}
1070
1079
1080
+ #[ test]
1081
+ fn test_buffered_reader_invalidated_after_read ( ) {
1082
+ let inner: & [ u8 ] = & [ 5 , 6 , 7 , 0 , 1 , 2 , 3 , 4 ] ;
1083
+ let mut reader = BufReader :: with_capacity ( 3 , io:: Cursor :: new ( inner) ) ;
1084
+
1085
+ assert_eq ! ( reader. fill_buf( ) . ok( ) , Some ( & [ 5 , 6 , 7 ] [ ..] ) ) ;
1086
+ reader. consume ( 3 ) ;
1087
+
1088
+ let mut buffer = [ 0 , 0 , 0 , 0 , 0 ] ;
1089
+ assert_eq ! ( reader. read( & mut buffer) . ok( ) , Some ( 5 ) ) ;
1090
+ assert_eq ! ( buffer, [ 0 , 1 , 2 , 3 , 4 ] ) ;
1091
+
1092
+ assert ! ( reader. seek_relative( -2 ) . is_ok( ) ) ;
1093
+ let mut buffer = [ 0 , 0 ] ;
1094
+ assert_eq ! ( reader. read( & mut buffer) . ok( ) , Some ( 2 ) ) ;
1095
+ assert_eq ! ( buffer, [ 3 , 4 ] ) ;
1096
+ }
1097
+
1098
+ #[ test]
1099
+ fn test_buffered_reader_invalidated_after_seek ( ) {
1100
+ let inner: & [ u8 ] = & [ 5 , 6 , 7 , 0 , 1 , 2 , 3 , 4 ] ;
1101
+ let mut reader = BufReader :: with_capacity ( 3 , io:: Cursor :: new ( inner) ) ;
1102
+
1103
+ assert_eq ! ( reader. fill_buf( ) . ok( ) , Some ( & [ 5 , 6 , 7 ] [ ..] ) ) ;
1104
+ reader. consume ( 3 ) ;
1105
+
1106
+ assert ! ( reader. seek( SeekFrom :: Current ( 5 ) ) . is_ok( ) ) ;
1107
+
1108
+ assert ! ( reader. seek_relative( -2 ) . is_ok( ) ) ;
1109
+ let mut buffer = [ 0 , 0 ] ;
1110
+ assert_eq ! ( reader. read( & mut buffer) . ok( ) , Some ( 2 ) ) ;
1111
+ assert_eq ! ( buffer, [ 3 , 4 ] ) ;
1112
+ }
1113
+
1071
1114
#[ test]
1072
1115
fn test_buffered_reader_seek_underflow ( ) {
1073
1116
// gimmick reader that yields its position modulo 256 for each byte
0 commit comments