[git commit master 1/1] libbb: make BB_EXECVP/LP try to exec real binary if there's no /proc/self/exe

Denys Vlasenko vda.linux at googlemail.com
Wed Feb 2 02:28:56 UTC 2011


commit: http://git.busybox.net/busybox/commit/?id=c71b469f5daceb717e31cc9ce46b0e058e2c57b6
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h            |   12 +++++++-----
 libbb/execable.c           |   10 +++++-----
 libbb/vfork_daemon_rexec.c |   12 ++++++------
 3 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 182b479..e69e279 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -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;
 
diff --git a/libbb/execable.c b/libbb/execable.c
index d376400..178a00a 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -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
 
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 5e0fb0d..cb4781a 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -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);
-- 
1.7.3.4



More information about the busybox-cvs mailing list