From 89573060d9e553419435a5828a93fa273a9327a9 Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Thu, 17 Sep 2020 22:48:52 +0200 Subject: [PATCH] http2: use variable integer for headers lengths --- rust/src/http2/parser.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/rust/src/http2/parser.rs b/rust/src/http2/parser.rs index 64ea876c96..0666519c34 100644 --- a/rust/src/http2/parser.rs +++ b/rust/src/http2/parser.rs @@ -360,8 +360,21 @@ fn http2_parse_headers_block_string(input: &[u8]) -> IResult<&[u8], Vec> { fn parser(input: &[u8]) -> IResult<&[u8], (u8, u8)> { bits!(input, tuple!(take_bits!(1u8), take_bits!(7u8))) } - let (i2, huffslen) = parser(input)?; - let (i3, data) = take!(i2, huffslen.1 as usize)?; + let (i1, huffslen) = parser(input)?; + let (i2, stringlen) = if huffslen.1 == 0x7F { + let (i3, maxsize2) = take_while_m_n!(i1, 0, 9, |ch| (ch & 0x80) != 0)?; + let (i4, maxsize3) = be_u8(i3)?; + let mut maxsize = 0x7F as u64; + for i in 0..maxsize2.len() { + maxsize += ((maxsize2[i] & 0x7F) as u64) << (7 * i); + } + maxsize += (maxsize3 as u64) << (7 * maxsize2.len()); + (i4, maxsize) + } else { + (i1, huffslen.1 as u64) + }; + + let (i3, data) = take!(i2, stringlen as usize)?; if huffslen.0 == 0 { return Ok((i3, data.to_vec())); } else { @@ -1174,5 +1187,4 @@ mod tests { } } } - } -- 2.47.3