diff options
Diffstat (limited to 'package/busybox/busybox-1.10.1-ssd.patch')
-rw-r--r-- | package/busybox/busybox-1.10.1-ssd.patch | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/package/busybox/busybox-1.10.1-ssd.patch b/package/busybox/busybox-1.10.1-ssd.patch new file mode 100644 index 000000000..156ce1b65 --- /dev/null +++ b/package/busybox/busybox-1.10.1-ssd.patch @@ -0,0 +1,187 @@ +--- busybox-1.10.1/debianutils/start_stop_daemon.c Sat Apr 19 05:50:30 2008 ++++ busybox-1.10.1-ssd/debianutils/start_stop_daemon.c Tue Apr 22 03:13:13 2008 +@@ -11,7 +11,6 @@ + /* NB: we have a problem here with /proc/NN/exe usage, similar to + * one fixed in killall/pidof */ + +-#include <getopt.h> + #include <sys/resource.h> + + /* Override ENABLE_FEATURE_PIDFILE */ +@@ -33,6 +32,7 @@ + int user_id; + smallint quiet; + smallint signal_nr; ++ struct stat execstat; + }; + #define G (*(struct globals*)&bb_common_bufsiz1) + #define found (G.found ) +@@ -43,6 +43,7 @@ + #define user_id (G.user_id ) + #define quiet (G.quiet ) + #define signal_nr (G.signal_nr ) ++#define execstat (G.execstat ) + #define INIT_G() \ + do { \ + user_id = -1; \ +@@ -50,25 +51,21 @@ + } while (0) + + +-static int pid_is_exec(pid_t pid, const char *name) ++static int pid_is_exec(pid_t pid) + { ++ struct stat st; + char buf[sizeof("/proc//exe") + sizeof(int)*3]; +- char *execbuf; +- int n; + + sprintf(buf, "/proc/%u/exe", pid); +- n = strlen(name) + 1; +- execbuf = xzalloc(n + 1); +- readlink(buf, execbuf, n); +- /* if readlink fails because link target is longer than strlen(name), +- * execbuf still contains "", and strcmp will return !0. */ +- n = strcmp(execbuf, name); +- if (ENABLE_FEATURE_CLEAN_UP) +- free(execbuf); +- return !n; /* nonzero (true) if execbuf == name */ ++ if (stat(buf, &st) < 0) ++ return 0; ++ if (st.st_dev == execstat.st_dev ++ && st.st_ino == execstat.st_ino) ++ return 1; ++ return 0; + } + +-static int pid_is_user(int pid, int uid) ++static int pid_is_user(int pid) + { + struct stat sb; + char buf[sizeof("/proc/") + sizeof(int)*3]; +@@ -76,42 +73,39 @@ + sprintf(buf, "/proc/%u", pid); + if (stat(buf, &sb) != 0) + return 0; +- return (sb.st_uid == uid); ++ return (sb.st_uid == user_id); + } + +-static int pid_is_cmd(pid_t pid, const char *name) ++static int pid_is_cmd(pid_t pid) + { +- char fname[sizeof("/proc//stat") + sizeof(int)*3]; +- char *buf; +- int r = 0; ++ char buf[256]; /* is it big enough? */ ++ char *p, *pe; + +- sprintf(fname, "/proc/%u/stat", pid); +- buf = xmalloc_open_read_close(fname, NULL); +- if (buf) { +- char *p = strchr(buf, '('); +- if (p) { +- char *pe = strrchr(++p, ')'); +- if (pe) { +- *pe = '\0'; +- r = !strcmp(p, name); +- } +- } +- free(buf); +- } +- return r; ++ sprintf(buf, "/proc/%u/stat", pid); ++ if (open_read_close(buf, buf, sizeof(buf) - 1) < 0) ++ return 0; ++ buf[sizeof(buf) - 1] = '\0'; /* paranoia */ ++ p = strchr(buf, '('); ++ if (!p) ++ return 0; ++ pe = strrchr(++p, ')'); ++ if (!pe) ++ return 0; ++ *pe = '\0'; ++ return !strcmp(p, cmdname); + } + + static void check(int pid) + { + struct pid_list *p; + +- if (execname && !pid_is_exec(pid, execname)) { ++ if (execname && !pid_is_exec(pid)) { + return; + } +- if (userspec && !pid_is_user(pid, user_id)) { ++ if (userspec && !pid_is_user(pid)) { + return; + } +- if (cmdname && !pid_is_cmd(pid, cmdname)) { ++ if (cmdname && !pid_is_cmd(pid)) { + return; + } + p = xmalloc(sizeof(*p)); +@@ -148,9 +142,16 @@ + procdir = xopendir("/proc"); + + pid = 0; +- while ((entry = readdir(procdir)) != NULL) { ++ while(1) { ++ errno = 0; /* clear any previous error */ ++ entry = readdir(procdir); ++// TODO: check for exact errno(s) which mean that we got stale entry ++ if (errno) /* Stale entry, process has died after opendir */ ++ continue; ++ if (!entry) /* EOF, no more entries */ ++ break; + pid = bb_strtou(entry->d_name, NULL, 10); +- if (errno) ++ if (errno) /* NaN */ + continue; + check(pid); + } +@@ -165,8 +166,6 @@ + struct pid_list *p; + int killed = 0; + +- do_procinit(); +- + if (cmdname) { + if (ENABLE_FEATURE_CLEAN_UP) what = xstrdup(cmdname); + if (!ENABLE_FEATURE_CLEAN_UP) what = cmdname; +@@ -251,7 +250,7 @@ + }; + + int start_stop_daemon_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +-int start_stop_daemon_main(int argc, char **argv) ++int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv) + { + unsigned opt; + char *signame; +@@ -293,7 +292,7 @@ + // if (retry_arg) + // retries = xatoi_u(retry_arg); + // ) +- argc -= optind; ++ //argc -= optind; + argv += optind; + + if (userspec) { +@@ -301,13 +300,15 @@ + if (errno) + user_id = xuname2uid(userspec); + } ++ if (execname) ++ xstat(execname, &execstat); + ++ do_procinit(); /* Both start and stop needs to know current processes */ ++ + if (opt & CTX_STOP) { + int i = do_stop(); + return (opt & OPT_OKNODO) ? 0 : (i <= 0); + } +- +- do_procinit(); + + if (found) { + if (!quiet) |