Skip to content

Commit e1a3197

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 9bb3259 commit e1a3197

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
@@ -1174,9 +1174,9 @@ impl HeaderName {
11741174
}
11751175
Repr::Custom(MaybeLower { buf, lower: false }) => {
11761176
for &b in buf.iter() {
1177-
// HEADER_CHARS maps all bytes that are not valid single-byte
1177+
// HEADER_CHARS_H2 maps all bytes that are not valid single-byte
11781178
// UTF-8 to 0 so this check returns an error for invalid UTF-8.
1179-
if b != HEADER_CHARS[b as usize] {
1179+
if HEADER_CHARS_H2[b as usize] == 0 {
11801180
return Err(InvalidHeaderName::new());
11811181
}
11821182
}
@@ -1865,4 +1865,16 @@ mod tests {
18651865
fn test_all_tokens() {
18661866
HeaderName::from_static("!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyz");
18671867
}
1868+
1869+
#[test]
1870+
fn test_from_lowercase() {
1871+
HeaderName::from_lowercase(&[0; 10]).unwrap_err();
1872+
HeaderName::from_lowercase(&[b'A'; 10]).unwrap_err();
1873+
HeaderName::from_lowercase(&[0x1; 10]).unwrap_err();
1874+
HeaderName::from_lowercase(&[0xFF; 10]).unwrap_err();
1875+
//HeaderName::from_lowercase(&[0; 100]).unwrap_err();
1876+
HeaderName::from_lowercase(&[b'A'; 100]).unwrap_err();
1877+
HeaderName::from_lowercase(&[0x1; 100]).unwrap_err();
1878+
HeaderName::from_lowercase(&[0xFF; 100]).unwrap_err();
1879+
}
18681880
}

0 commit comments

Comments
 (0)