]> granicus.if.org Git - procps-ng/commitdiff
pmap: Plug memory leak in range_arguments().
authorQualys Security Advisory <qsa@qualys.com>
Thu, 1 Jan 1970 00:00:00 +0000 (00:00 +0000)
committerCraig Small <csmall@enc.com.au>
Fri, 18 May 2018 21:32:22 +0000 (07:32 +1000)
Also, simplify the code slightly (but functionally equivalent). Check
the return value of xstrdup() only once (yes, it can return NULL).

pmap.c

diff --git a/pmap.c b/pmap.c
index 41116edcb9ca6aca0f3c3cd90e2725fabd848d48..88f6c90b8d3c6720ec7a2a66d7c72f12fcac756a 100644 (file)
--- a/pmap.c
+++ b/pmap.c
@@ -744,26 +744,29 @@ static int one_proc(proc_t * p)
        return 0;
 }
 
-static void range_arguments(char *optarg)
+static void range_arguments(const char *optarg)
 {
        char *arg1;
        char *arg2;
-
-       arg1 = xstrdup(optarg);
+       char *const copy = xstrdup(optarg);
+       if (!copy)
+               goto fail;
+       arg1 = copy;
        arg2 = strchr(arg1, ',');
        if (arg2)
-               *arg2 = '\0';
-       if (arg2)
-               ++arg2;
+               *arg2++ = '\0';
        else
                arg2 = arg1;
-       if (arg1 && *arg1)
+       if (*arg1)
                range_low = STRTOUKL(arg1, &arg1, 16);
        if (*arg2)
                range_high = STRTOUKL(arg2, &arg2, 16);
-       if (arg1 && (*arg1 || *arg2))
-               xerrx(EXIT_FAILURE, "%s: '%s'", _("failed to parse argument"),
-                     optarg);
+       if (*arg1 || *arg2)
+               goto fail;
+       free(copy);
+       return;
+fail:
+       xerrx(EXIT_FAILURE, "%s: '%s'", _("failed to parse argument"), optarg);
 }