]> git.ipfire.org Git - people/ms/suricata.git/commitdiff
conf: avoid quadratic complexity
authorPhilippe Antoine <contact@catenacyber.fr>
Mon, 8 Nov 2021 13:18:30 +0000 (14:18 +0100)
committerVictor Julien <vjulien@oisf.net>
Mon, 22 Nov 2021 10:24:42 +0000 (11:24 +0100)
Ticket: 4812

When adding many sequence nodes

src/conf-yaml-loader.c

index b28dd28f648919a6ab677f784c5353f734a20c35..99081e4e9c0b51534e59d2d509a08802c79dfa63 100644 (file)
@@ -181,6 +181,7 @@ ConfYamlParse(yaml_parser_t *parser, ConfNode *parent, int inseq, int rlevel)
     int state = 0;
     int seq_idx = 0;
     int retval = 0;
+    int was_empty = -1;
 
     if (rlevel++ > RECURSION_LIMIT) {
         SCLogError(SC_ERR_CONF_YAML_ERROR, "Recursion limit reached while parsing "
@@ -242,8 +243,19 @@ ConfYamlParse(yaml_parser_t *parser, ConfNode *parent, int inseq, int rlevel)
             if (inseq) {
                 char sequence_node_name[DEFAULT_NAME_LEN];
                 snprintf(sequence_node_name, DEFAULT_NAME_LEN, "%d", seq_idx++);
-                ConfNode *seq_node = ConfNodeLookupChild(parent,
-                    sequence_node_name);
+                ConfNode *seq_node = NULL;
+                if (was_empty < 0) {
+                    // initialize was_empty
+                    if (TAILQ_EMPTY(&parent->head)) {
+                        was_empty = 1;
+                    } else {
+                        was_empty = 0;
+                    }
+                }
+                // we only check if the node's list was not empty at first
+                if (was_empty == 0) {
+                    seq_node = ConfNodeLookupChild(parent, sequence_node_name);
+                }
                 if (seq_node != NULL) {
                     /* The sequence node has already been set, probably
                      * from the command line.  Remove it so it gets