]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: init: emit warning when -sf/-sd cannot parse argument
authorChris Lane <chris@disputingtaste.com>
Mon, 5 Feb 2018 23:15:44 +0000 (23:15 +0000)
committerWilly Tarreau <w@1wt.eu>
Tue, 6 Feb 2018 06:23:32 +0000 (07:23 +0100)
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

index 67df6cdce915a5581706570efd2d65202ec4a879..98b18dafa67ff99c4a8c48bae5ba4b3d696c8fa5 100644 (file)
@@ -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++;