]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
conf: avoid quadratic complexity
authorPhilippe Antoine <contact@catenacyber.fr>
Mon, 8 Nov 2021 13:18:30 +0000 (14:18 +0100)
committerJeff Lucovsky <jeff@lucovsky.org>
Sat, 15 Jan 2022 13:01:17 +0000 (08:01 -0500)
Ticket: 4812

When adding many sequence nodes

(cherry picked from commit 15649424a76d01eb332d85620ffc4956d4f3d9be)

src/conf-yaml-loader.c

index 307cdab92590d5ed1e5172000f4116371fc309b8..fd1e470b655c5da412fe1a052b89041914730e4b 100644 (file)
@@ -183,6 +183,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 "
@@ -235,8 +236,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