Skip to content

Commit 129f9fc

Browse files
authored
codec: fix incorrect handling of invalid utf-8 in LinesCodec::decode_eof (#7011)
1 parent b5c227d commit 129f9fc

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

tokio-util/src/codec/lines_codec.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,14 @@ impl Decoder for LinesCodec {
169169
Ok(match self.decode(buf)? {
170170
Some(frame) => Some(frame),
171171
None => {
172+
self.next_index = 0;
172173
// No terminating newline - return remaining data, if any
173174
if buf.is_empty() || buf == &b"\r"[..] {
174175
None
175176
} else {
176177
let line = buf.split_to(buf.len());
177178
let line = without_carriage_return(&line);
178179
let line = utf8(line)?;
179-
self.next_index = 0;
180180
Some(line.to_string())
181181
}
182182
}

tokio-util/tests/codecs.rs

+13
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ fn lines_decoder() {
6262
assert_eq!(None, codec.decode_eof(buf).unwrap());
6363
}
6464

65+
#[test]
66+
fn lines_decoder_invalid_utf8() {
67+
let mut codec = LinesCodec::new();
68+
let buf = &mut BytesMut::new();
69+
buf.reserve(200);
70+
buf.put_slice(b"line 1\xc3\x28");
71+
assert_eq!(None, codec.decode(buf).unwrap());
72+
assert!(codec.decode_eof(buf).is_err());
73+
assert_eq!(None, codec.decode_eof(buf).unwrap());
74+
buf.put_slice(b"line 22222222222222\n");
75+
assert_eq!("line 22222222222222", codec.decode(buf).unwrap().unwrap());
76+
}
77+
6578
#[test]
6679
fn lines_decoder_max_length() {
6780
const MAX_LENGTH: usize = 6;

0 commit comments

Comments
 (0)