]> granicus.if.org Git - psmisc/commitdiff
Avoid possible crash and memory leak in killall
authorWerner Fink <werner@suse.de>
Sat, 14 Mar 2015 21:39:12 +0000 (08:39 +1100)
committerCraig Small <csmall@enc.com.au>
Sat, 14 Mar 2015 21:39:12 +0000 (08:39 +1100)
By reading the current HEAD I stumbled on a memory leak in killall.c
as well as a not assigned pointer got_long in load_proc_cmdline()
which may lead to SIGSEGV.

References: [patches:#67] https://sourceforge.net/p/psmisc/bugs/67
Signed-off-by: Werner Fink <werner@suse.de>
src/killall.c

index 31cc412f7f703fa758fc60944b7d0d42b6191364..90532ff5e447e7ce34234efc06046b2f2b09e5b1 100644 (file)
@@ -375,9 +375,10 @@ load_proc_cmdline(const pid_t pid, const char *comm, char **command, int *got_lo
        if (verbose)
            fprintf (stderr, _("killall: skipping partial match %s(%d)\n"),
                    comm, pid);
-       return -1;
        *got_long = okay;
+       return -1;
     }
+    *got_long = okay;
     return 0;
 }
 
@@ -469,6 +470,7 @@ kill_all (int signal, int name_count, char **namelist, struct passwd *pwent)
          exit (1);
        }
   }
+    got_long = 0;
     for (i = 0; i < pids; i++)
     {
        pid_t id;
@@ -501,6 +503,8 @@ kill_all (int signal, int name_count, char **namelist, struct passwd *pwent)
        if ( older_than   && process_age_sec && (process_age_sec < older_than ) )
            continue;
 
+        if (command)
+            free(command);
         got_long = 0;
         command = NULL;                /* make gcc happy */
         if (length == COMM_LEN - 1)