]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: state-file: do not store duplicates in the global tree
authorWilly Tarreau <w@1wt.eu>
Fri, 20 Dec 2019 16:23:40 +0000 (17:23 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 20 Dec 2019 16:23:40 +0000 (17:23 +0100)
The global state file tree isn't configured for unique keys, so if an
entry appears multiple times, e.g. due to a bogus script that concatenates
entries multiple times, this will needlessly eat memory. Let's just drop
duplicates.

This should be backported to 2.1.

src/server.c

index 718ca1c4003fc571e07061d6894ab0eb40c87058..466da441b4b52a1b23aef87f29f61eec63952e29 100644 (file)
@@ -75,7 +75,7 @@ struct dict server_name_dict = {
 };
 
 /* tree where global state_file is loaded */
-struct eb_root state_file = EB_ROOT;
+struct eb_root state_file = EB_ROOT_UNIQUE;
 
 int srv_downtime(const struct server *s)
 {
@@ -3632,7 +3632,12 @@ void apply_server_state(void)
                                goto nextline;
                        }
                        memcpy(st->name_name.key, trash.area, trash.data + 1);
-                       ebst_insert(&state_file, &st->name_name);
+                       if (ebst_insert(&state_file, &st->name_name) != &st->name_name) {
+                               /* this is a duplicate key, probably a hand-crafted file,
+                                * drop it!
+                                */
+                               goto nextline;
+                       }
 
                        /* save line */
                        st->line = line;