From 5546c8bdce64b1e67c897ac7705ca572c09f34bd Mon Sep 17 00:00:00 2001 From: Tim Duesterhus Date: Wed, 26 May 2021 17:45:33 +0200 Subject: [PATCH] MINOR: cfgparse: Fail when encountering extra arguments in macro This resolves GitHub issue #1124. This change should be backported as a *warning* to 2.4. --- src/cfgparse.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/cfgparse.c b/src/cfgparse.c index 8132e47e8b..adc903b530 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2056,6 +2056,13 @@ int readcfgfile(const char *file) char *errmsg = NULL; int cond; + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; + break; + } + nested_cond_lvl++; if (nested_cond_lvl >= MAXNESTEDCONDS) { ha_alert("parsing [%s:%d]: too many nested '.if', max is %d.\n", file, linenum, MAXNESTEDCONDS); @@ -2098,6 +2105,13 @@ int readcfgfile(const char *file) char *errmsg = NULL; int cond; + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; + break; + } + if (!nested_cond_lvl) { ha_alert("parsing [%s:%d]: lone '.elif' with no matching '.if'.\n", file, linenum); err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; @@ -2140,6 +2154,13 @@ int readcfgfile(const char *file) goto next_line; } else if (strcmp(args[0], ".else") == 0) { + if (*args[1]) { + ha_alert("parsing [%s:%d]: Unxpected argument '%s' for '%s'.\n", + file, linenum, args[1], args[0]); + err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; + break; + } + if (!nested_cond_lvl) { ha_alert("parsing [%s:%d]: lone '.else' with no matching '.if'.\n", file, linenum); err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; @@ -2165,10 +2186,16 @@ int readcfgfile(const char *file) goto next_line; } else if (strcmp(args[0], ".endif") == 0) { + if (*args[1]) { + ha_alert("parsing [%s:%d]: Unxpected argument '%s' for '%s'.\n", + file, linenum, args[1], args[0]); + err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; + break; + } + if (!nested_cond_lvl) { ha_alert("parsing [%s:%d]: lone '.endif' with no matching '.if'.\n", file, linenum); - err_code |= ERR_ALERT | ERR_FATAL; - fatal++; + err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; break; } nested_cond_lvl--; @@ -2189,20 +2216,48 @@ int readcfgfile(const char *file) /* .warning/.error/.notice/.diag */ if (*args[0] == '.') { if (strcmp(args[0], ".alert") == 0) { + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'. Use quotes if the message should contain spaces.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto next_line; + } + ha_alert("parsing [%s:%d]: '%s'.\n", file, linenum, args[1]); err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; goto err; } else if (strcmp(args[0], ".warning") == 0) { + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'. Use quotes if the message should contain spaces.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto next_line; + } + ha_warning("parsing [%s:%d]: '%s'.\n", file, linenum, args[1]); err_code |= ERR_WARN; goto next_line; } else if (strcmp(args[0], ".notice") == 0) { + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'. Use quotes if the message should contain spaces.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto next_line; + } + ha_notice("parsing [%s:%d]: '%s'.\n", file, linenum, args[1]); goto next_line; } else if (strcmp(args[0], ".diag") == 0) { + if (*args[2]) { + ha_alert("parsing [%s:%d]: Unexpected argument '%s' for '%s'. Use quotes if the message should contain spaces.\n", + file, linenum, args[2], args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto next_line; + } + ha_diag_warning("parsing [%s:%d]: '%s'.\n", file, linenum, args[1]); goto next_line; }