From 6292beb86fa9a3999f0f0b76185e0a893af85cd0 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 10 Jul 2015 14:52:14 -0500 Subject: [PATCH] Add a basename_r() and use it in names_to_pid() to avoid basename() overwriting itself on some inputs. (Which makes killall really impolite. Bug report from Nicholas Noury via Elliott Hughes.) --- lib/lib.c | 10 +++++++++- lib/lib.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/lib.c b/lib/lib.c index ea65f77..05e377f 100644 --- 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; } diff --git a/lib/lib.h b/lib/lib.h index 92bd6b5..3183f32 100644 --- 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 -- 2.7.4