]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
http2: use variable integer for headers lengths
authorPhilippe Antoine <contact@catenacyber.fr>
Thu, 17 Sep 2020 20:48:52 +0000 (22:48 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 30 Sep 2020 13:02:45 +0000 (15:02 +0200)
rust/src/http2/parser.rs

index 64ea876c96806084c02b2781b510233bbf884298..0666519c34925595555434548b6a805f0bc8c871 100644 (file)
@@ -360,8 +360,21 @@ fn http2_parse_headers_block_string(input: &[u8]) -> IResult<&[u8], Vec<u8>> {
     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 {
             }
         }
     }
-
 }