From 1d76f439da81d3a05f0e0fdde3f81ec56fb20836 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 6 Feb 2007 01:20:12 +0000 Subject: [PATCH] EXEC_PREFER_APPLETS support by Gabriel L. Somlo --- archival/tar.c | 2 +- console-tools/openvt.c | 2 +- coreutils/chroot.c | 2 +- coreutils/env.c | 2 +- coreutils/install.c | 2 +- coreutils/nice.c | 2 +- coreutils/nohup.c | 2 +- e2fsprogs/fsck.c | 2 +- findutils/xargs.c | 2 +- include/libbb.h | 9 +++++---- libbb/execable.c | 10 ++++++++++ loginutils/adduser.c | 2 +- loginutils/login.c | 2 +- miscutils/devfsd.c | 2 +- miscutils/setsid.c | 2 +- miscutils/taskset.c | 2 +- miscutils/time.c | 2 +- networking/ifupdown.c | 2 +- networking/nc.c | 2 +- runit/chpst.c | 10 +++++----- runit/runsvdir.c | 2 +- util-linux/setarch.c | 2 +- 22 files changed, 39 insertions(+), 28 deletions(-) diff --git a/archival/tar.c b/archival/tar.c index 48c4f3f8c..d8e36749e 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -529,7 +529,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag, close(gzipStatusPipe[0]); fcntl(gzipStatusPipe[1], F_SETFD, FD_CLOEXEC); /* close on exec shows success */ - execlp(zip_exec, zip_exec, "-f", NULL); + BB_EXECLP(zip_exec, zip_exec, "-f", NULL); vfork_exec_errno = errno; close(gzipStatusPipe[1]); diff --git a/console-tools/openvt.c b/console-tools/openvt.c index 9296219bd..eb9f49fe2 100644 --- a/console-tools/openvt.c +++ b/console-tools/openvt.c @@ -36,7 +36,7 @@ int openvt_main(int argc, char **argv) dup2(fd, STDERR_FILENO); while (fd > 2) close(fd--); - execvp(argv[2], &argv[2]); + BB_EXECVP(argv[2], &argv[2]); _exit(1); } return EXIT_SUCCESS; diff --git a/coreutils/chroot.c b/coreutils/chroot.c index 16c743fef..fcd70f21a 100644 --- a/coreutils/chroot.c +++ b/coreutils/chroot.c @@ -33,6 +33,6 @@ int chroot_main(int argc, char **argv) argv[1] = (char *) "-i"; } - execvp(*argv, argv); + BB_EXECVP(*argv, argv); bb_perror_msg_and_die("cannot execute %s", *argv); } diff --git a/coreutils/env.c b/coreutils/env.c index 04279f3e0..7be0c63a5 100644 --- a/coreutils/env.c +++ b/coreutils/env.c @@ -81,7 +81,7 @@ int env_main(int argc, char** argv) } if (*argv) { - execvp(*argv, argv); + BB_EXECVP(*argv, argv); /* SUSv3-mandated exit codes. */ xfunc_error_retval = (errno == ENOENT) ? 127 : 126; bb_perror_msg_and_die("%s", *argv); diff --git a/coreutils/install.c b/coreutils/install.c index dd73fb693..c105addc5 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -126,7 +126,7 @@ int install_main(int argc, char **argv) ret = EXIT_FAILURE; } if (flags & OPT_STRIP) { - if (execlp("strip", "strip", dest, NULL) == -1) { + if (BB_EXECLP("strip", "strip", dest, NULL) == -1) { bb_perror_msg("strip"); ret = EXIT_FAILURE; } diff --git a/coreutils/nice.c b/coreutils/nice.c index b7bff6a52..328531528 100644 --- a/coreutils/nice.c +++ b/coreutils/nice.c @@ -47,7 +47,7 @@ int nice_main(int argc, char **argv) } } - execvp(*argv, argv); /* Now exec the desired program. */ + BB_EXECVP(*argv, argv); /* Now exec the desired program. */ /* The exec failed... */ xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */ diff --git a/coreutils/nohup.c b/coreutils/nohup.c index a9944b7f4..6a6c70e13 100644 --- a/coreutils/nohup.c +++ b/coreutils/nohup.c @@ -53,7 +53,7 @@ int nohup_main(int argc, char **argv) close(nullfd); signal(SIGHUP, SIG_IGN); - execvp(argv[1], argv+1); + BB_EXECVP(argv[1], argv+1); if (ENABLE_FEATURE_CLEAN_UP && home) free((char*)nohupout); bb_perror_msg_and_die("%s", argv[1]); diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index 9ec31d2a3..ad22fcd7a 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c @@ -677,7 +677,7 @@ static void execute(const char *type, const char *device, const char *mntpt, * Use "fsck -s" to avoid... */ close(0); } - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("%s", argv[0]); } } diff --git a/findutils/xargs.c b/findutils/xargs.c index c2060f804..44dbcdad0 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -60,7 +60,7 @@ static int xargs_exec(char *const *args) if (p == 0) { /* vfork -- child */ - execvp(args[0], args); + BB_EXECVP(args[0], args); exec_errno = errno; /* set error to shared stack */ _exit(1); } diff --git a/include/libbb.h b/include/libbb.h index 7342f89f6..babb39ba9 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -562,12 +562,13 @@ char *find_execable(const char *filename); int exists_execable(const char *filename); #ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS -#define BB_EXECVP(prog,cmd) \ - execvp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd) +int bb_execvp(const char *file, char *const argv[]); +#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd) #define BB_EXECLP(prog,cmd,...) \ - execlp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, cmd, __VA_ARGS__) + execlp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \ + cmd, __VA_ARGS__) #else -#define BB_EXECVP(prog,cmd) execvp(prog,cmd) +#define BB_EXECVP(prog,cmd) execvp(prog,cmd) #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) #endif diff --git a/libbb/execable.c b/libbb/execable.c index 817c06736..601c7539e 100644 --- a/libbb/execable.c +++ b/libbb/execable.c @@ -59,3 +59,13 @@ int exists_execable(const char *filename) } return 0; } + +#ifdef ENABLE_FEATURE_EXEC_PREFER_APPLETS +/* just like the real execvp, but try to launch an applet named 'file' first + */ +int bb_execvp(const char *file, char *const argv[]) +{ + return execvp(find_applet_by_name(file) ? CONFIG_BUSYBOX_EXEC_PATH : file, + argv); +} +#endif diff --git a/loginutils/adduser.c b/loginutils/adduser.c index 8193aea82..b6d0c62ea 100644 --- a/loginutils/adduser.c +++ b/loginutils/adduser.c @@ -80,7 +80,7 @@ static void passwd_wrapper(const char *login) ATTRIBUTE_NORETURN; static void passwd_wrapper(const char *login) { static const char prog[] = "passwd"; - execlp(prog, prog, login, NULL); + BB_EXECLP(prog, prog, login, NULL); bb_error_msg_and_die("failed to execute '%s', you must set the password for '%s' manually", prog, login); } diff --git a/loginutils/login.c b/loginutils/login.c index a19191b8c..830df0a7f 100644 --- a/loginutils/login.c +++ b/loginutils/login.c @@ -357,7 +357,7 @@ auth_failed: setenv("LOGIN_UID", utoa(pw->pw_uid), 1); setenv("LOGIN_GID", utoa(pw->pw_gid), 1); setenv("LOGIN_SHELL", pw->pw_shell, 1); - execvp(script, t_argv); + BB_EXECVP(script, t_argv); exit(1); default: /* parent */ wait(NULL); diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c index 69c698781..96c172cb8 100644 --- a/miscutils/devfsd.c +++ b/miscutils/devfsd.c @@ -378,7 +378,7 @@ static void fork_and_execute(int die, char *arg0, char **arg ) /* Child : if arg0 != NULL do execvp */ if(arg0 != NULL ) { - execvp (arg0, arg); + BB_EXECVP(arg0, arg); msg_logger_and_die(LOG_ERR, "execvp"); } } diff --git a/miscutils/setsid.c b/miscutils/setsid.c index b4d5ced46..6db07be5f 100644 --- a/miscutils/setsid.c +++ b/miscutils/setsid.c @@ -36,7 +36,7 @@ int setsid_main(int argc, char *argv[]) setsid(); /* no error possible */ - execvp(argv[1], argv + 1); + BB_EXECVP(argv[1], argv + 1); bb_perror_msg_and_die("%s", argv[1]); } diff --git a/miscutils/taskset.c b/miscutils/taskset.c index cf6a8be99..b3bf4902e 100644 --- a/miscutils/taskset.c +++ b/miscutils/taskset.c @@ -91,7 +91,7 @@ int taskset_main(int argc, char** argv) goto print_aff; } ++argv; - execvp(*argv, argv); + BB_EXECVP(*argv, argv); bb_perror_msg_and_die("%s", *argv); } #undef OPT_p diff --git a/miscutils/time.c b/miscutils/time.c index 56f1d4ab8..a45919502 100644 --- a/miscutils/time.c +++ b/miscutils/time.c @@ -410,7 +410,7 @@ static void run_command(char *const *cmd, resource_t * resp) else if (pid == 0) { /* If child. */ /* Don't cast execvp arguments; that causes errors on some systems, versus merely warnings if the cast is left off. */ - execvp(cmd[0], cmd); + BB_EXECVP(cmd[0], cmd); bb_error_msg("cannot run %s", cmd[0]); _exit(errno == ENOENT ? 127 : 126); } diff --git a/networking/ifupdown.c b/networking/ifupdown.c index ce3b9bab7..ccebecd95 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c @@ -1004,7 +1004,7 @@ static int popen2(FILE **in, FILE **out, char *command, ...) close(infd[1]); close(outfd[0]); close(outfd[1]); - execvp(command, argv); + BB_EXECVP(command, argv); exit(127); default: /* parent */ *in = fdopen(infd[1], "w"); diff --git a/networking/nc.c b/networking/nc.c index c1e881162..1bdecaf5e 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -149,7 +149,7 @@ int nc_main(int argc, char **argv) } dup2(0, 1); dup2(0, 2); - USE_NC_EXTRA(execvp(execparam[0], execparam);) + USE_NC_EXTRA(BB_EXECVP(execparam[0], execparam);) /* Don't print stuff or it will go over the wire.... */ _exit(127); } diff --git a/runit/chpst.c b/runit/chpst.c index 053051d1d..7b907845f 100644 --- a/runit/chpst.c +++ b/runit/chpst.c @@ -310,7 +310,7 @@ int chpst_main(int argc, char **argv) if (OPT_nostdin) close(0); if (OPT_nostdout) close(1); if (OPT_nostderr) close(2); - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("exec %s", argv[0]); } @@ -322,7 +322,7 @@ static void setuidgid(int argc, char **argv) if (!account) bb_show_usage(); if (!*++argv) bb_show_usage(); suidgid((char*)account); - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("exec %s", argv[0]); } @@ -334,7 +334,7 @@ static void envuidgid(int argc, char **argv) if (!account) bb_show_usage(); if (!*++argv) bb_show_usage(); euidgid((char*)account); - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("exec %s", argv[0]); } @@ -346,7 +346,7 @@ static void envdir(int argc, char **argv) if (!dir) bb_show_usage(); if (!*++argv) bb_show_usage(); edir(dir); - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("exec %s", argv[0]); } @@ -369,6 +369,6 @@ static void softlimit(int argc, char **argv) argv += optind; if (!argv[0]) bb_show_usage(); slimit(); - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); bb_perror_msg_and_die("exec %s", argv[0]); } diff --git a/runit/runsvdir.c b/runit/runsvdir.c index d9053ad6a..2d2b5db31 100644 --- a/runit/runsvdir.c +++ b/runit/runsvdir.c @@ -73,7 +73,7 @@ static void runsv(int no, const char *name) sig_uncatch(SIGHUP); sig_uncatch(SIGTERM); if (pgrp) setsid(); - execvp(prog[0], prog); + BB_EXECVP(prog[0], prog); //pathexec_run(*prog, prog, (char* const*)environ); fatal2_cannot("start runsv ", name); } diff --git a/util-linux/setarch.c b/util-linux/setarch.c index 8f4e308d4..a7a45ec4d 100644 --- a/util-linux/setarch.c +++ b/util-linux/setarch.c @@ -46,7 +46,7 @@ retry: if (personality(pers) >= 0) { /* Try to execute the program */ - execvp(argv[0], argv); + BB_EXECVP(argv[0], argv); } bb_perror_msg_and_die("%s", argv[0]);