libbb: make BB_EXECVP/LP try to exec real binary if there's no /proc/self/exe
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 2 Feb 2011 02:28:56 +0000 (03:28 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 2 Feb 2011 02:28:56 +0000 (03:28 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/libbb.h
libbb/execable.c
libbb/vfork_daemon_rexec.c

index 182b479884138b0b22c79ef360af97b8cf0bb5b4..e69e2794492758ff572658a4b27ad0c9abe7fc2e 100644 (file)
@@ -867,14 +867,16 @@ int exists_execable(const char *filename) FAST_FUNC;
  * but it may exec busybox and call applet instead of searching PATH.
  */
 #if ENABLE_FEATURE_PREFER_APPLETS
-int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
-#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
+int BB_EXECVP(const char *file, char *const argv[]) FAST_FUNC;
 #define BB_EXECLP(prog,cmd,...) \
-       execlp((find_applet_by_name(prog) >= 0) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \
-               cmd, __VA_ARGS__)
+       do { \
+               if (find_applet_by_name(prog) >= 0) \
+                       execlp(bb_busybox_exec_path, cmd, __VA_ARGS__); \
+               execlp(prog, cmd, __VA_ARGS__); \
+       } while (0)
 #else
 #define BB_EXECVP(prog,cmd)     execvp(prog,cmd)
-#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
+#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd,__VA_ARGS__)
 #endif
 int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
 
index d37640007791e431641c554172c0c96ef9c52384..178a00a5f1f69a762c7f20e5b2dd852bcf2ae2b0 100644 (file)
@@ -68,12 +68,12 @@ int FAST_FUNC exists_execable(const char *filename)
 }
 
 #if ENABLE_FEATURE_PREFER_APPLETS
-/* just like the real execvp, but try to launch an applet named 'file' first
- */
-int FAST_FUNC bb_execvp(const char *file, char *const argv[])
+/* just like the real execvp, but try to launch an applet named 'file' first */
+int FAST_FUNC BB_EXECVP(const char *file, char *const argv[])
 {
-       return execvp(find_applet_by_name(file) >= 0 ? bb_busybox_exec_path : file,
-                                       argv);
+       if (find_applet_by_name(file) >= 0)
+               execvp(bb_busybox_exec_path, argv);
+       return execvp(file, argv);
 }
 #endif
 
index 5e0fb0d737f0886b38a354c87eee86b4a69108c4..cb4781a59196aa8cea497034d1a7c0db7b1b225c 100644 (file)
@@ -182,17 +182,17 @@ int FAST_FUNC spawn_and_wait(char **argv)
        int a = find_applet_by_name(argv[0]);
 
        if (a >= 0 && (APPLET_IS_NOFORK(a)
-#if BB_MMU
+# if BB_MMU
                        || APPLET_IS_NOEXEC(a) /* NOEXEC trick needs fork() */
-#endif
+# endif
        )) {
-#if BB_MMU
+# if BB_MMU
                if (APPLET_IS_NOFORK(a))
-#endif
+# endif
                {
                        return run_nofork_applet(a, argv);
                }
-#if BB_MMU
+# if BB_MMU
                /* MMU only */
                /* a->noexec is true */
                rc = fork();
@@ -201,7 +201,7 @@ int FAST_FUNC spawn_and_wait(char **argv)
                /* child */
                xfunc_error_retval = EXIT_FAILURE;
                run_applet_no_and_exit(a, argv);
-#endif
+# endif
        }
 #endif /* FEATURE_PREFER_APPLETS */
        rc = spawn(argv);