BUG/MINOR: cfgparse: Fix transition between 2 sections with the same name
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.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 5df53d3..a28d24c 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1880,32 +1880,31 @@
list_for_each_entry(ics, §ions, 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);