]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
http2: avoid quadratic complexity in headers 9003/head
authorPhilippe Antoine <pantoine@oisf.net>
Wed, 31 May 2023 12:53:28 +0000 (14:53 +0200)
committerVictor Julien <vjulien@oisf.net>
Fri, 9 Jun 2023 08:38:35 +0000 (10:38 +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
(cherry picked from commit 635073688289aa9a4928f78cdfd1777ae21f7d40)

rust/src/http2/parser.rs

index d99efd95a6c79bd2be6a3d3a15b4a92f489d9c13..2d4f363bfaf8ade73fe740e09f81b575d2565ca7 100644 (file)
@@ -457,12 +457,15 @@ fn http2_parse_headers_block_literal_incindex<'a>(
                 } else {
                     dyn_headers.table.push(headcopy);
                 }
-                while dyn_headers.current_size > dyn_headers.max_size && dyn_headers.table.len() > 0
+                let mut toremove = 0;
+                while dyn_headers.current_size > dyn_headers.max_size
+                    && 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));
         }