BUG/MINOR: config: insufficient syntax check of the global "maxconn" value

The maxconn value is decoded using atol(), so values like "3k" are
rightly converter as interger 3, while the user wants 3000.

This patch fixes this behavior by reporting a parsing error.

This patch could be backported on all maintained version, but it
could break some configuration. The bug is really minor, I recommend
to not backport, or backport a patch which only throws a warning in
place of a fatal error.
This commit is contained in:
Thierry Fournier 2022-10-01 10:06:59 +02:00 committed by Willy Tarreau
parent 8522348482
commit 3d1c334d44

View File

@ -592,6 +592,8 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
goto out; goto out;
} }
else if (strcmp(args[0], "maxconn") == 0) { else if (strcmp(args[0], "maxconn") == 0) {
char *stop;
if (alertif_too_many_args(1, file, linenum, args, &err_code)) if (alertif_too_many_args(1, file, linenum, args, &err_code))
goto out; goto out;
if (global.maxconn != 0) { if (global.maxconn != 0) {
@ -604,7 +606,12 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
err_code |= ERR_ALERT | ERR_FATAL; err_code |= ERR_ALERT | ERR_FATAL;
goto out; goto out;
} }
global.maxconn = atol(args[1]); global.maxconn = strtol(args[1], &stop, 10);
if (*stop != '\0') {
ha_alert("parsing [%s:%d] : cannot parse '%s' value '%s', an integer is expected.\n", file, linenum, args[0], args[1]);
err_code |= ERR_ALERT | ERR_FATAL;
goto out;
}
#ifdef SYSTEM_MAXCONN #ifdef SYSTEM_MAXCONN
if (global.maxconn > SYSTEM_MAXCONN && cfg_maxconn <= SYSTEM_MAXCONN) { if (global.maxconn > SYSTEM_MAXCONN && cfg_maxconn <= SYSTEM_MAXCONN) {
ha_alert("parsing [%s:%d] : maxconn value %d too high for this system.\nLimiting to %d. Please use '-n' to force the value.\n", file, linenum, global.maxconn, SYSTEM_MAXCONN); ha_alert("parsing [%s:%d] : maxconn value %d too high for this system.\nLimiting to %d. Please use '-n' to force the value.\n", file, linenum, global.maxconn, SYSTEM_MAXCONN);