aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-02-02 03:28:56 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-02-02 03:28:56 +0100
commitc71b469f5daceb717e31cc9ce46b0e058e2c57b6 (patch)
treeab428529615091f3d1759ad9fcd254f0cab46b19
parent099e528919e2219772265e99ab8a43d188c1b8db (diff)
downloadbusybox-w32-c71b469f5daceb717e31cc9ce46b0e058e2c57b6.tar.gz
busybox-w32-c71b469f5daceb717e31cc9ce46b0e058e2c57b6.tar.bz2
busybox-w32-c71b469f5daceb717e31cc9ce46b0e058e2c57b6.zip
libbb: make BB_EXECVP/LP try to exec real binary if there's no /proc/self/exe
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--include/libbb.h12
-rw-r--r--libbb/execable.c10
-rw-r--r--libbb/vfork_daemon_rexec.c12
3 files changed, 18 insertions, 16 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 182b47988..e69e27944 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -867,14 +867,16 @@ int exists_execable(const char *filename) FAST_FUNC;
867 * but it may exec busybox and call applet instead of searching PATH. 867 * but it may exec busybox and call applet instead of searching PATH.
868 */ 868 */
869#if ENABLE_FEATURE_PREFER_APPLETS 869#if ENABLE_FEATURE_PREFER_APPLETS
870int bb_execvp(const char *file, char *const argv[]) FAST_FUNC; 870int BB_EXECVP(const char *file, char *const argv[]) FAST_FUNC;
871#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
872#define BB_EXECLP(prog,cmd,...) \ 871#define BB_EXECLP(prog,cmd,...) \
873 execlp((find_applet_by_name(prog) >= 0) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \ 872 do { \
874 cmd, __VA_ARGS__) 873 if (find_applet_by_name(prog) >= 0) \
874 execlp(bb_busybox_exec_path, cmd, __VA_ARGS__); \
875 execlp(prog, cmd, __VA_ARGS__); \
876 } while (0)
875#else 877#else
876#define BB_EXECVP(prog,cmd) execvp(prog,cmd) 878#define BB_EXECVP(prog,cmd) execvp(prog,cmd)
877#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) 879#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd,__VA_ARGS__)
878#endif 880#endif
879int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC; 881int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
880 882
diff --git a/libbb/execable.c b/libbb/execable.c
index d37640007..178a00a5f 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -68,12 +68,12 @@ int FAST_FUNC exists_execable(const char *filename)
68} 68}
69 69
70#if ENABLE_FEATURE_PREFER_APPLETS 70#if ENABLE_FEATURE_PREFER_APPLETS
71/* just like the real execvp, but try to launch an applet named 'file' first 71/* just like the real execvp, but try to launch an applet named 'file' first */
72 */ 72int FAST_FUNC BB_EXECVP(const char *file, char *const argv[])
73int FAST_FUNC bb_execvp(const char *file, char *const argv[])
74{ 73{
75 return execvp(find_applet_by_name(file) >= 0 ? bb_busybox_exec_path : file, 74 if (find_applet_by_name(file) >= 0)
76 argv); 75 execvp(bb_busybox_exec_path, argv);
76 return execvp(file, argv);
77} 77}
78#endif 78#endif
79 79
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 5e0fb0d73..cb4781a59 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)
182 int a = find_applet_by_name(argv[0]); 182 int a = find_applet_by_name(argv[0]);
183 183
184 if (a >= 0 && (APPLET_IS_NOFORK(a) 184 if (a >= 0 && (APPLET_IS_NOFORK(a)
185#if BB_MMU 185# if BB_MMU
186 || APPLET_IS_NOEXEC(a) /* NOEXEC trick needs fork() */ 186 || APPLET_IS_NOEXEC(a) /* NOEXEC trick needs fork() */
187#endif 187# endif
188 )) { 188 )) {
189#if BB_MMU 189# if BB_MMU
190 if (APPLET_IS_NOFORK(a)) 190 if (APPLET_IS_NOFORK(a))
191#endif 191# endif
192 { 192 {
193 return run_nofork_applet(a, argv); 193 return run_nofork_applet(a, argv);
194 } 194 }
195#if BB_MMU 195# if BB_MMU
196 /* MMU only */ 196 /* MMU only */
197 /* a->noexec is true */ 197 /* a->noexec is true */
198 rc = fork(); 198 rc = fork();
@@ -201,7 +201,7 @@ int FAST_FUNC spawn_and_wait(char **argv)
201 /* child */ 201 /* child */
202 xfunc_error_retval = EXIT_FAILURE; 202 xfunc_error_retval = EXIT_FAILURE;
203 run_applet_no_and_exit(a, argv); 203 run_applet_no_and_exit(a, argv);
204#endif 204# endif
205 } 205 }
206#endif /* FEATURE_PREFER_APPLETS */ 206#endif /* FEATURE_PREFER_APPLETS */
207 rc = spawn(argv); 207 rc = spawn(argv);