Skip to content

Commit 96dc52f

Browse files
committed
fix: HeaderName::from_lowercase allowing NUL bytes in some cases
If a byte slice larger than 64 bytes is passed to `HeaderName::from_lowercase`, it could allow NUL bytes. This fixes the bug. Reported-by: [email protected]
1 parent caa8b4f commit 96dc52f

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/header/name.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,9 +1176,9 @@ impl HeaderName {
11761176
}
11771177
Repr::Custom(MaybeLower { buf, lower: false }) => {
11781178
for &b in buf.iter() {
1179-
// HEADER_CHARS maps all bytes that are not valid single-byte
1179+
// HEADER_CHARS_H2 maps all bytes that are not valid single-byte
11801180
// UTF-8 to 0 so this check returns an error for invalid UTF-8.
1181-
if b != HEADER_CHARS[b as usize] {
1181+
if HEADER_CHARS_H2[b as usize] == 0 {
11821182
return Err(InvalidHeaderName::new());
11831183
}
11841184
}
@@ -1904,4 +1904,16 @@ mod tests {
19041904
fn test_all_tokens() {
19051905
HeaderName::from_static("!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyz");
19061906
}
1907+
1908+
#[test]
1909+
fn test_from_lowercase() {
1910+
HeaderName::from_lowercase(&[0; 10]).unwrap_err();
1911+
HeaderName::from_lowercase(&[b'A'; 10]).unwrap_err();
1912+
HeaderName::from_lowercase(&[0x1; 10]).unwrap_err();
1913+
HeaderName::from_lowercase(&[0xFF; 10]).unwrap_err();
1914+
//HeaderName::from_lowercase(&[0; 100]).unwrap_err();
1915+
HeaderName::from_lowercase(&[b'A'; 100]).unwrap_err();
1916+
HeaderName::from_lowercase(&[0x1; 100]).unwrap_err();
1917+
HeaderName::from_lowercase(&[0xFF; 100]).unwrap_err();
1918+
}
19071919
}

0 commit comments

Comments
 (0)