fix(headers): add length checks to ETag parsing
Bug found using `cargo fuzz`.
This commit is contained in:
@@ -83,6 +83,9 @@ header! {
|
|||||||
test_header!(test14,
|
test_header!(test14,
|
||||||
vec![b"matched-\"dquotes\""],
|
vec![b"matched-\"dquotes\""],
|
||||||
None::<ETag>);
|
None::<ETag>);
|
||||||
|
test_header!(test15,
|
||||||
|
vec![b"\""],
|
||||||
|
None::<ETag>);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,15 +123,17 @@ impl FromStr for EntityTag {
|
|||||||
let length: usize = s.len();
|
let length: usize = s.len();
|
||||||
let slice = &s[..];
|
let slice = &s[..];
|
||||||
// Early exits if it doesn't terminate in a DQUOTE.
|
// Early exits if it doesn't terminate in a DQUOTE.
|
||||||
if !slice.ends_with('"') {
|
if !slice.ends_with('"') || slice.len() < 2 {
|
||||||
return Err(::Error::Header);
|
return Err(::Error::Header);
|
||||||
}
|
}
|
||||||
// The etag is weak if its first char is not a DQUOTE.
|
// The etag is weak if its first char is not a DQUOTE.
|
||||||
if slice.starts_with('"') && check_slice_validity(&slice[1..length-1]) {
|
if slice.len() >= 2 && slice.starts_with('"')
|
||||||
|
&& check_slice_validity(&slice[1..length-1]) {
|
||||||
// No need to check if the last char is a DQUOTE,
|
// No need to check if the last char is a DQUOTE,
|
||||||
// we already did that above.
|
// we already did that above.
|
||||||
return Ok(EntityTag { weak: false, tag: slice[1..length-1].to_owned() });
|
return Ok(EntityTag { weak: false, tag: slice[1..length-1].to_owned() });
|
||||||
} else if slice.starts_with("W/\"") && check_slice_validity(&slice[3..length-1]) {
|
} else if slice.len() >= 4 && slice.starts_with("W/\"")
|
||||||
|
&& check_slice_validity(&slice[3..length-1]) {
|
||||||
return Ok(EntityTag { weak: true, tag: slice[3..length-1].to_owned() });
|
return Ok(EntityTag { weak: true, tag: slice[3..length-1].to_owned() });
|
||||||
}
|
}
|
||||||
Err(::Error::Header)
|
Err(::Error::Header)
|
||||||
|
|||||||
Reference in New Issue
Block a user