]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: config: fix multiple declaration of section parsers
authorWilly Tarreau <w@1wt.eu>
Thu, 26 May 2016 15:55:28 +0000 (17:55 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 26 May 2016 15:59:28 +0000 (17:59 +0200)
Ben Cabot reported that after commit 5e4261b ("CLEANUP: config:
detect double registration of a config section") recently introduced
in 1.7-dev, it's not possible anymore to load multiple configuration
files. Bryan Talbot provided a simple reproducer to exhibit the issue.

It turns out that function readcfgfile() registers new parsers for
section keywords for each new file. In addition to being useless, this
has the negative effect of wasting memory and slowing down the config
parser as the number of configuration files increases.

This fix only needs to be backported if/where the commit above is
backported.

src/cfgparse.c

index 9b7646523de9becb0909134fb495b456d7ea0977..fed5bd5377b577017aa5c93b6d6b2762154f3044 100644 (file)
@@ -6968,19 +6968,6 @@ int readcfgfile(const char *file)
                return -1;
        }
 
-       /* Register internal sections */
-       if (!cfg_register_section("listen",   cfg_parse_listen) ||
-           !cfg_register_section("frontend", cfg_parse_listen) ||
-           !cfg_register_section("backend",  cfg_parse_listen) ||
-           !cfg_register_section("defaults", cfg_parse_listen) ||
-           !cfg_register_section("global",   cfg_parse_global) ||
-           !cfg_register_section("userlist", cfg_parse_users)  ||
-           !cfg_register_section("peers",    cfg_parse_peers)  ||
-           !cfg_register_section("mailers",  cfg_parse_mailers) ||
-           !cfg_register_section("namespace_list",    cfg_parse_netns) ||
-           !cfg_register_section("resolvers", cfg_parse_resolvers))
-               return -1;
-
        if ((f=fopen(file,"r")) == NULL) {
                free(thisline);
                return -1;
@@ -9132,6 +9119,22 @@ void cfg_unregister_sections(void)
        }
 }
 
+__attribute__((constructor))
+static void cfgparse_init(void)
+{
+       /* Register internal sections */
+       cfg_register_section("listen",         cfg_parse_listen);
+       cfg_register_section("frontend",       cfg_parse_listen);
+       cfg_register_section("backend",        cfg_parse_listen);
+       cfg_register_section("defaults",       cfg_parse_listen);
+       cfg_register_section("global",         cfg_parse_global);
+       cfg_register_section("userlist",       cfg_parse_users);
+       cfg_register_section("peers",          cfg_parse_peers);
+       cfg_register_section("mailers",        cfg_parse_mailers);
+       cfg_register_section("namespace_list", cfg_parse_netns);
+       cfg_register_section("resolvers",      cfg_parse_resolvers);
+}
+
 /*
  * Local variables:
  *  c-indent-level: 8