ash: do not do find_applet() twice in shellexec/tryexec
This commit is contained in:
parent
55e06c1edf
commit
4a9ca13fe7
42
shell/ash.c
42
shell/ash.c
@ -6881,21 +6881,18 @@ static int builtinloc = -1; /* index in path of %builtin, or -1 */
|
||||
|
||||
|
||||
static void
|
||||
tryexec(char *cmd, char **argv, char **envp)
|
||||
tryexec(USE_FEATURE_SH_STANDALONE(int applet_no,) char *cmd, char **argv, char **envp)
|
||||
{
|
||||
int repeated = 0;
|
||||
|
||||
#if ENABLE_FEATURE_SH_STANDALONE
|
||||
if (strchr(cmd, '/') == NULL) {
|
||||
int a = find_applet_by_name(cmd);
|
||||
if (a >= 0) {
|
||||
if (APPLET_IS_NOEXEC(a))
|
||||
run_applet_no_and_exit(a, argv);
|
||||
/* re-exec ourselves with the new arguments */
|
||||
execve(bb_busybox_exec_path, argv, envp);
|
||||
/* If they called chroot or otherwise made the binary no longer
|
||||
* executable, fall through */
|
||||
}
|
||||
if (applet_no >= 0) {
|
||||
if (APPLET_IS_NOEXEC(applet_no))
|
||||
run_applet_no_and_exit(applet_no, argv);
|
||||
/* re-exec ourselves with the new arguments */
|
||||
execve(bb_busybox_exec_path, argv, envp);
|
||||
/* If they called chroot or otherwise made the binary no longer
|
||||
* executable, fall through */
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -6931,7 +6928,6 @@ tryexec(char *cmd, char **argv, char **envp)
|
||||
* Exec a program. Never returns. If you change this routine, you may
|
||||
* have to change the find_command routine as well.
|
||||
*/
|
||||
#define environment() listvars(VEXPORT, VUNSET, 0)
|
||||
static void shellexec(char **, const char *, int) ATTRIBUTE_NORETURN;
|
||||
static void
|
||||
shellexec(char **argv, const char *path, int idx)
|
||||
@ -6940,21 +6936,24 @@ shellexec(char **argv, const char *path, int idx)
|
||||
int e;
|
||||
char **envp;
|
||||
int exerrno;
|
||||
#if ENABLE_FEATURE_SH_STANDALONE
|
||||
int applet_no = -1;
|
||||
#endif
|
||||
|
||||
clearredir(1);
|
||||
envp = environment();
|
||||
if (strchr(argv[0], '/')
|
||||
envp = listvars(VEXPORT, VUNSET, 0);
|
||||
if (strchr(argv[0], '/') != NULL
|
||||
#if ENABLE_FEATURE_SH_STANDALONE
|
||||
|| find_applet_by_name(argv[0]) >= 0
|
||||
|| (applet_no = find_applet_by_name(argv[0])) >= 0
|
||||
#endif
|
||||
) {
|
||||
tryexec(argv[0], argv, envp);
|
||||
tryexec(USE_FEATURE_SH_STANDALONE(applet_no,) argv[0], argv, envp);
|
||||
e = errno;
|
||||
} else {
|
||||
e = ENOENT;
|
||||
while ((cmdname = padvance(&path, argv[0])) != NULL) {
|
||||
if (--idx < 0 && pathopt == NULL) {
|
||||
tryexec(cmdname, argv, envp);
|
||||
tryexec(USE_FEATURE_SH_STANDALONE(-1,) cmdname, argv, envp);
|
||||
if (errno != ENOENT && errno != ENOTDIR)
|
||||
e = errno;
|
||||
}
|
||||
@ -11630,11 +11629,10 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
|
||||
if (bcmd)
|
||||
goto builtin_success;
|
||||
continue;
|
||||
} else if (!(act & DO_NOFUNC)
|
||||
&& prefix(pathopt, "func")) {
|
||||
/* handled below */
|
||||
} else {
|
||||
/* ignore unimplemented options */
|
||||
}
|
||||
if ((act & DO_NOFUNC)
|
||||
|| !prefix(pathopt, "func")
|
||||
) { /* ignore unimplemented options */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user