]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: cfgparse: Fix transition between 2 sections with the same name
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 30 Nov 2018 12:50:47 +0000 (13:50 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 1 Dec 2018 16:20:36 +0000 (17:20 +0100)
When a section's parser is registered, it can also define a post section
callback, called at the end of the section parsing. But when 2 sections with the
same name followed each other, the transition between them was missed. This
induced 2 bugs. First, the call to the post section callback was skipped. Then,
the parsing of the second section was mixed with the first one.

This patch must be backported in 1.8.

src/cfgparse.c

index 5df53d34802c9ca22400f4908f8fd61aca343fcc..a28d24cce9ddd9f1f096c16e57efc64ac9ab5d4b 100644 (file)
@@ -1880,32 +1880,31 @@ next_line:
                list_for_each_entry(ics, &sections, list) {
                        if (strcmp(args[0], ics->section_name) == 0) {
                                cursection = ics->section_name;
+                               pcs = cs;
                                cs = ics;
                                break;
                        }
                }
 
+               if (pcs && pcs->post_section_parser) {
+                       err_code |= pcs->post_section_parser();
+                       if (err_code & ERR_ABORT)
+                               goto err;
+                       pcs = NULL;
+               }
+
                if (!cs) {
                        ha_alert("parsing [%s:%d]: unknown keyword '%s' out of section.\n", file, linenum, args[0]);
                        err_code |= ERR_ALERT | ERR_FATAL;
                } else {
-                       /* else it's a section keyword */
-
-                       if (pcs != cs && pcs && pcs->post_section_parser) {
-                               err_code |= pcs->post_section_parser();
-                               if (err_code & ERR_ABORT)
-                                       goto err;
-                       }
-
                        err_code |= cs->section_parser(file, linenum, args, kwm);
                        if (err_code & ERR_ABORT)
                                goto err;
                }
-               pcs = cs;
        }
 
-       if (pcs == cs && pcs && pcs->post_section_parser)
-               err_code |= pcs->post_section_parser();
+       if (cs && pcs->post_section_parser)
+               err_code |= cs->post_section_parser();
 
 err:
        free(cfg_scope);