@@ -1087,11 +1087,11 @@ where
1087
1087
1088
1088
// We can't parse any UTF-8
1089
1089
if valid_utf_8_bytes == 0 {
1090
+ // This should be enough bytes to get one UTF-8 character.
1091
+ ensure ! ( n_valid < 4 , InvalidUtf8Snafu ) ;
1092
+
1090
1093
// We aren't going to get any more input
1091
1094
ensure ! ( n_read != 0 , RanOutOfInputSnafu ) ;
1092
-
1093
- // This should be enough bytes to get one UTF-8 character.
1094
- ensure ! ( n_valid < 4 , InvalidUtf8Snafu )
1095
1095
}
1096
1096
1097
1097
// Safety: We just calculated the number of valid UTF-8 bytes
@@ -1106,11 +1106,6 @@ where
1106
1106
self . buffer . copy_within ( valid_utf_8_bytes..n_valid, 0 ) ;
1107
1107
1108
1108
self . n_incomplete = n_valid - valid_utf_8_bytes;
1109
- assert ! (
1110
- self . n_incomplete < 4 ,
1111
- "Should never have 4 or more incomplete bytes, had {}" ,
1112
- self . n_incomplete,
1113
- ) ;
1114
1109
1115
1110
if !s. is_empty ( ) {
1116
1111
return Ok ( Some ( s) ) ;
@@ -1217,6 +1212,18 @@ mod test {
1217
1212
assert ! ( !buffer. reader. is_empty( ) ) ;
1218
1213
}
1219
1214
1215
+ #[ tokio:: test]
1216
+ async fn valid_followed_by_invalid_utf8 ( ) {
1217
+ let bytes = [ b'A' , 0xc3 , 0x28 , 0xc3 , 0x28 , 0xc3 , 0x28 ] ;
1218
+
1219
+ let reader = FixedAsyncRead :: success_exact ( [ bytes] ) ;
1220
+ let mut buffer = Utf8BufReader :: new ( reader) ;
1221
+
1222
+ assert_matches ! ( buffer. next( ) . await , Ok ( Some ( s) ) => s == "A" ) ;
1223
+ assert_matches ! ( buffer. next( ) . await , Err ( Utf8BufReaderError :: InvalidUtf8 ) ) ;
1224
+ assert ! ( buffer. reader. is_empty( ) ) ;
1225
+ }
1226
+
1220
1227
#[ tokio:: test]
1221
1228
async fn split_across_responses ( ) {
1222
1229
let bytes: [ u8 ; 12 ] = "🙂🙂🙂" . as_bytes ( ) . try_into ( ) . unwrap ( ) ;
0 commit comments