(from git format-patch -1 as per mail thread [PATCH] CONTRIB: log: 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.
---
 src/haproxy.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/haproxy.c b/src/haproxy.c
index f1a2fb9..30490b3 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1445,13 +1445,26 @@ 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",
+                                                       (char *)*argv, (char 
*)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.1.1

Reply via email to