diff options
author | Rob Landley <rob@landley.net> | 2005-05-07 08:27:34 +0000 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2005-05-07 08:27:34 +0000 |
commit | 0fcd9430ceabcc2a0bec9470f358f56572d36f3d (patch) | |
tree | 2a0143f3ae1e7706e1ea7b2a741e9a8894b34c9a | |
parent | cce1ae2ce541563eb70dcb181b5031fe1ad98e4a (diff) |
This one's from me. Fix ash "standalone shell".
If we exec /proc/self/exe and only fall back to /bin/busybox if /proc isn't
there, then we have a reasonable chance of having the standalone shell work
even if busybox isn't installed in /bin on the system in question.
Still won't work in a chroot environment, but it's an improvement.
-rw-r--r-- | shell/ash.c | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/shell/ash.c b/shell/ash.c index 0e9d58ae6..57316c916 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -3722,27 +3722,13 @@ tryexec(char *cmd, char **argv, char **envp) { int repeated = 0; #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL - int flg_bb = 0; - char *name = cmd; - - if(strchr(name, '/') == NULL && find_applet_by_name(name) != NULL) { - flg_bb = 1; - } - if(flg_bb) { - char **ap; - char **new; - - *argv = name; - if(strcmp(name, "busybox")) { - for (ap = argv; *ap; ap++); - ap = new = xmalloc((ap - argv + 2) * sizeof(char *)); - *ap++ = cmd = "/bin/busybox"; - while ((*ap++ = *argv++)); - argv = new; - repeated++; - } else { - cmd = "/bin/busybox"; - } + if(find_applet_by_name(cmd) != NULL) { + /* re-exec ourselves with the new arguments */ + execve("/proc/self/exe",argv,envp); + /* If proc isn't mounted, try hardcoded path to busybox binary*/ + execve("/bin/busybox",argv,envp); + /* If they called chroot or otherwise made the binary no longer + * executable, fall through */ } #endif |