From 236062f7cea355bae9bbb6f5cd1953e78f36c6d8 Mon Sep 17 00:00:00 2001 From: Chris Lane Date: Mon, 5 Feb 2018 23:15:44 +0000 Subject: [PATCH] MINOR: init: emit warning when -sf/-sd cannot parse argument Previously, -sf and -sd command line parsing used atol which cannot detect errors. I had a problem where I was doing -sf "$pid1 $pid2 $pid" and it was sending the gracefully terminate signal only to the first pid. The change uses strtol and checks endptr and errno to see if the parsing worked. It will exit when the pid list is not parsed. [wt: this should be backported to 1.8] --- src/haproxy.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/haproxy.c b/src/haproxy.c index 67df6cdce9..98b18dafa6 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1445,13 +1445,27 @@ static void init(int argc, char **argv) else oldpids_sig = SIGTERM; /* terminate immediately */ while (argc > 1 && argv[1][0] != '-') { + char * endptr = NULL; oldpids = realloc(oldpids, (nb_oldpids + 1) * sizeof(int)); if (!oldpids) { ha_alert("Cannot allocate old pid : out of memory.\n"); exit(1); } argc--; argv++; - oldpids[nb_oldpids] = atol(*argv); + errno = 0; + oldpids[nb_oldpids] = strtol(*argv, &endptr, 10); + if (errno) { + ha_alert("-%2s option: failed to parse {%s}: %s\n", + flag, + *argv, strerror(errno)); + exit(1); + } else if (endptr && strlen(endptr)) { + while (isspace(*endptr)) endptr++; + if (*endptr != 0) + ha_alert("-%2s option: some bytes unconsumed in PID list {%s}\n", + flag, endptr); + exit(1); + } if (oldpids[nb_oldpids] <= 0) usage(progname); nb_oldpids++; -- 2.39.5