diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-02 03:28:56 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-02 03:28:56 +0100 |
commit | c71b469f5daceb717e31cc9ce46b0e058e2c57b6 (patch) | |
tree | ab428529615091f3d1759ad9fcd254f0cab46b19 | |
parent | 099e528919e2219772265e99ab8a43d188c1b8db (diff) | |
download | busybox-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.h | 12 | ||||
-rw-r--r-- | libbb/execable.c | 10 | ||||
-rw-r--r-- | libbb/vfork_daemon_rexec.c | 12 |
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 |
870 | int bb_execvp(const char *file, char *const argv[]) FAST_FUNC; | 870 | int 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 |
879 | int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC; | 881 | int 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 | */ | 72 | int FAST_FUNC BB_EXECVP(const char *file, char *const argv[]) |
73 | int 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); |