]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
http2: avoid quadratic complexity in headers
authorPhilippe Antoine <pantoine@oisf.net>
Wed, 31 May 2023 12:53:28 +0000 (14:53 +0200)
committerVictor Julien <vjulien@oisf.net>
Mon, 5 Jun 2023 09:07:46 +0000 (11:07 +0200)
When adding an element to the dynamic headers table, the oldest
ones may get evicted. When multiple elements get evicted, they
should get evicted all at once with drain, instead of one by one
as there will be a massive move each time.

Ticket: #6103

rust/src/http2/parser.rs

index 88486f03b03933e6dcbf6e6c0a867644e8b1f89a..adabeb28c6e4592cf3de7d2190844bb209f209ad 100644 (file)
@@ -456,13 +456,15 @@ fn http2_parse_headers_block_literal_incindex<'a>(
                 } else {
                     dyn_headers.table.push(headcopy);
                 }
+                let mut toremove = 0;
                 while dyn_headers.current_size > dyn_headers.max_size
-                    && !dyn_headers.table.is_empty()
+                    && toremove < dyn_headers.table.len()
                 {
                     dyn_headers.current_size -=
-                        32 + dyn_headers.table[0].name.len() + dyn_headers.table[0].value.len();
-                    dyn_headers.table.remove(0);
+                        32 + dyn_headers.table[toremove].name.len() + dyn_headers.table[toremove].value.len();
+                    toremove += 1;
                 }
+                dyn_headers.table.drain(0..toremove);
             }
             return Ok((r, head));
         }