summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2005-05-07 08:27:34 +0000
committerRob Landley <rob@landley.net>2005-05-07 08:27:34 +0000
commit0fcd9430ceabcc2a0bec9470f358f56572d36f3d (patch)
tree2a0143f3ae1e7706e1ea7b2a741e9a8894b34c9a
parentcce1ae2ce541563eb70dcb181b5031fe1ad98e4a (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.c28
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