]> granicus.if.org Git - psmisc/commitdiff
killall: fix reporting when >32 names specified
authorJeff Smith <whydoubt@gmail.com>
Thu, 16 Mar 2017 16:18:07 +0000 (11:18 -0500)
committerJeff Smith <whydoubt@gmail.com>
Thu, 23 Mar 2017 16:49:28 +0000 (11:49 -0500)
Recording which named processes were killed is stored in an unsigned
long bitmask.  Some of the bit-wise math is done with an int.  If
sizeof(long) > sizeof(int), some not-found processes may not be reported
as such, and/or the return code may be wrong.

This is fixed by making sure bit-wise math is being done with a long.

src/killall.c

index bd882f0c8123f75c83fc0e997c85bd2183a6bbab..2b6f982fb5e0b15fa86d7850140f0a45169f6b7e 100644 (file)
@@ -607,7 +607,7 @@ kill_all (int signal, int name_count, char **namelist, struct passwd *pwent)
                        comm, process_group ? "pgid " : "", id, signal);
            if (found_name >= 0)
                    /* mark item of namelist */
-                   found |= 1 << found_name;
+                   found |= 1UL << found_name;
            pid_killed[pids_killed++] = id;
        }
        else if (errno != ESRCH || interactive)
@@ -622,12 +622,12 @@ kill_all (int signal, int name_count, char **namelist, struct passwd *pwent)
     free(pgids);
     if (!quiet)
        for (i = 0; i < name_count; i++)
-           if (!(found & (1 << i)))
+           if (!(found & (1UL << i)))
                fprintf (stderr, _("%s: no process found\n"), namelist[i]);
     if (name_count)
         /* killall returns a zero return code if at least one process has 
          * been killed for each listed command. */
-        error = found == ((1 << (name_count - 1)) | ((1 << (name_count - 1)) - 1)) ? 0 : 1;
+        error = found == ((1UL << (name_count - 1)) | ((1UL << (name_count - 1)) - 1)) ? 0 : 1;
     else
         /* in nameless mode killall returns a zero return code if at least 
          * one process has killed */