mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-27 00:00:12 +02:00
Add max line length to LinesCodec (#590)
* codec: add new constructor `with_max_length ` to `LinesCodec` * codec: add security note to docs Signed-off-by: Eliza Weisman <[email protected]> * Fix Rust 1.25 compatibility * codec: Fix incorrect line lengths in tests (and add assertions) Signed-off-by: Eliza Weisman <[email protected]> * codec: Fix off-by-one error in lines codec Signed-off-by: Eliza Weisman <[email protected]> * codec: Fix call to decode rather than decode_eof in test Signed-off-by: Eliza Weisman <[email protected]> * codec: Fix incorrect LinesCodec::decode_max_line_length This bug was introduced after the fix for the off-by-one error. Fortunately, the doctests caught it. Signed-off-by: Eliza Weisman <[email protected]> * codec: Minor style improvements Signed-off-by: Eliza Weisman <[email protected]> * codec: Don't allow LinesCodec length limit to be set after construction Signed-off-by: Eliza Weisman <[email protected]> * codec: change LinesCodec to error and discard line when at max length * codec: Fix build on Rust 1.25 The slice patterns syntax wasn't supported yet in that release. Signed-off-by: Eliza Weisman <[email protected]> * codec: Add test for out-of-bounds index when peeking Signed-off-by: Eliza Weisman <[email protected]> * codec: Fix out of bounds index * codec: Fix incomplete comment Signed-off-by: Eliza Weisman <[email protected]> * codec: Add test for line decoder buffer underrun
This commit is contained in:
committed by
Toby Lawrence
parent
0f44adf5f6
commit
4ae6c997ee
@@ -55,6 +55,63 @@ fn lines_decoder() {
|
||||
assert_eq!(None, codec.decode_eof(buf).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lines_decoder_max_length() {
|
||||
const MAX_LENGTH: usize = 6;
|
||||
|
||||
let mut codec = LinesCodec::with_max_length(MAX_LENGTH);
|
||||
let buf = &mut BytesMut::new();
|
||||
|
||||
buf.reserve(200);
|
||||
buf.put("line 1 is too long\nline 2\r\nline 3\n\r\n\r");
|
||||
|
||||
assert!(codec.decode(buf).is_err());
|
||||
assert!(codec.decode(buf).is_err());
|
||||
|
||||
let line = codec.decode(buf).unwrap().unwrap();
|
||||
assert!(line.len() <= MAX_LENGTH, "{:?}.len() <= {:?}", line, MAX_LENGTH);
|
||||
assert_eq!("line 2", line);
|
||||
|
||||
let line = codec.decode(buf).unwrap().unwrap();
|
||||
assert!(line.len() <= MAX_LENGTH, "{:?}.len() <= {:?}", line, MAX_LENGTH);
|
||||
assert_eq!("line 3", line);
|
||||
|
||||
let line = codec.decode(buf).unwrap().unwrap();
|
||||
assert!(line.len() <= MAX_LENGTH, "{:?}.len() <= {:?}", line, MAX_LENGTH);
|
||||
assert_eq!("", line);
|
||||
|
||||
assert_eq!(None, codec.decode(buf).unwrap());
|
||||
assert_eq!(None, codec.decode_eof(buf).unwrap());
|
||||
buf.put("k");
|
||||
assert_eq!(None, codec.decode(buf).unwrap());
|
||||
|
||||
let line = codec.decode_eof(buf).unwrap().unwrap();
|
||||
assert!(line.len() <= MAX_LENGTH, "{:?}.len() <= {:?}", line, MAX_LENGTH);
|
||||
assert_eq!("\rk", line);
|
||||
|
||||
assert_eq!(None, codec.decode(buf).unwrap());
|
||||
assert_eq!(None, codec.decode_eof(buf).unwrap());
|
||||
|
||||
// Line that's one character too long. This could cause an out of bounds
|
||||
// error if we peek at the next characters using slice indexing.
|
||||
buf.put("aaabbbc");
|
||||
assert!(codec.decode(buf).is_err());
|
||||
}
|
||||
#[test]
|
||||
fn lines_decoder_max_length_underrun() {
|
||||
const MAX_LENGTH: usize = 6;
|
||||
|
||||
let mut codec = LinesCodec::with_max_length(MAX_LENGTH);
|
||||
let buf = &mut BytesMut::new();
|
||||
buf.put("line ");
|
||||
assert_eq!(None, codec.decode(buf).unwrap());
|
||||
|
||||
buf.put("too l");
|
||||
assert_eq!(None, codec.decode(buf).unwrap());
|
||||
buf.put("ong\n");
|
||||
assert_eq!("line too long", codec.decode(buf).unwrap().unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lines_encoder() {
|
||||
let mut codec = LinesCodec::new();
|
||||
|
||||
Reference in New Issue
Block a user