Add a basename_r() and use it in names_to_pid() to avoid basename() overwriting
authorRob Landley <rob@landley.net>
Fri, 10 Jul 2015 19:52:14 +0000 (14:52 -0500)
committerRob Landley <rob@landley.net>
Fri, 10 Jul 2015 19:52:14 +0000 (14:52 -0500)
itself on some inputs. (Which makes killall really impolite. Bug report
from Nicholas Noury via Elliott Hughes.)

lib/lib.c
lib/lib.h

index ea65f77..05e377f 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -798,6 +798,14 @@ void mode_to_string(mode_t mode, char *buf)
   *buf = c;
 }
 
+char *basename_r(char *name)
+{
+  char *s = strrchr(name, '/');
+
+  if (s) return s+1;
+  return name;
+}
+
 // Execute a callback for each PID that matches a process name from a list.
 void names_to_pid(char **names, int (*callback)(pid_t pid, char *name))
 {
@@ -816,7 +824,7 @@ void names_to_pid(char **names, int (*callback)(pid_t pid, char *name))
 
     for (curname = names; *curname; curname++)
       if (**curname == '/' ? !strcmp(cmd, *curname)
-          : !strcmp(basename(cmd), basename(*curname)))
+          : !strcmp(basename_r(cmd), basename_r(*curname)))
         if (callback(u, *curname)) break;
     if (*curname) break;
   }
index 92bd6b5..3183f32 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -235,6 +235,7 @@ char *num_to_sig(int sig);
 
 mode_t string_to_mode(char *mode_str, mode_t base);
 void mode_to_string(mode_t mode, char *buf);
+char *basename_r(char *name);
 void names_to_pid(char **names, int (*callback)(pid_t pid, char *name));
 
 // Functions in need of further review/cleanup