This one's from me. Fix ash "standalone shell".
authorRob Landley <rob@landley.net>
Sat, 7 May 2005 08:27:34 +0000 (08:27 -0000)
committerRob Landley <rob@landley.net>
Sat, 7 May 2005 08:27:34 +0000 (08:27 -0000)
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.

shell/ash.c

index 0e9d58ae66c0e207b2a8309d2a23cac16171769e..57316c9161de5b75af19f51a7aaa12e5b3b9503d 100644 (file)
@@ -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