From: Willy Tarreau Date: Fri, 20 Dec 2019 16:23:40 +0000 (+0100) Subject: BUG/MINOR: state-file: do not store duplicates in the global tree X-Git-Tag: v2.2-dev1~160 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fd1aa01f72d98760ae8c1bfbfc66351875df3380;p=thirdparty%2Fhaproxy.git BUG/MINOR: state-file: do not store duplicates in the global tree 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. --- diff --git a/src/server.c b/src/server.c index 718ca1c400..466da441b4 100644 --- a/src/server.c +++ b/src/server.c @@ -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;