diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2017-04-12 15:01:54 +0300 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2017-04-12 23:22:01 +0300 |
commit | eab991f2cbf1d3f174880c28bfd7efd6b8e87ee0 (patch) | |
tree | 392768409cdba4429401893e6adc7e9cd102404a /main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch | |
parent | 0c36e883cfacaecdb74adc09af6ab7a0af2e44b9 (diff) | |
download | aports-eab991f2cbf1d3f174880c28bfd7efd6b8e87ee0.tar.bz2 aports-eab991f2cbf1d3f174880c28bfd7efd6b8e87ee0.tar.xz |
main/busybox: ash: support exec -a
Diffstat (limited to 'main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch')
-rw-r--r-- | main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch b/main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch new file mode 100644 index 0000000000..70f420a923 --- /dev/null +++ b/main/busybox/0013-ash-make-shellexec-capable-of-using-separate-argv-0-.patch @@ -0,0 +1,91 @@ +From e139ae307e4fd9eb3b86a6fc2e97b4e212925199 Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko <vda.linux@googlemail.com> +Date: Wed, 12 Apr 2017 21:02:33 +0200 +Subject: [PATCH 13/14] ash: make shellexec capable of using separate argv[0] + and filename to exec + +function old new delta +execcmd 71 78 +7 +shellexec 221 224 +3 +evalcommand 1158 1161 +3 +------------------------------------------------------------------------------ +(add/remove: 0/0 grow/shrink: 3/0 up/down: 13/0) Total: 13 bytes + +Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> +--- + shell/ash.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +diff --git a/shell/ash.c b/shell/ash.c +index 983f7b1..044f166 100644 +--- a/shell/ash.c ++++ b/shell/ash.c +@@ -7744,9 +7744,8 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) char *cmd, char **argv, char ** + * have to change the find_command routine as well. + * argv[-1] must exist and be writable! See tryexec() for why. + */ +-static void shellexec(char **, const char *, int) NORETURN; +-static void +-shellexec(char **argv, const char *path, int idx) ++static void shellexec(char *prog, char **argv, const char *path, int idx) NORETURN; ++static void shellexec(char *prog, char **argv, const char *path, int idx) + { + char *cmdname; + int e; +@@ -7755,12 +7754,12 @@ shellexec(char **argv, const char *path, int idx) + int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */ + + envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL); +- if (strchr(argv[0], '/') != NULL ++ if (strchr(prog, '/') != NULL + #if ENABLE_FEATURE_SH_STANDALONE +- || (applet_no = find_applet_by_name(argv[0])) >= 0 ++ || (applet_no = find_applet_by_name(prog)) >= 0 + #endif + ) { +- tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) argv[0], argv, envp); ++ tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); + if (applet_no >= 0) { + /* We tried execing ourself, but it didn't work. + * Maybe /proc/self/exe doesn't exist? +@@ -7772,7 +7771,7 @@ shellexec(char **argv, const char *path, int idx) + } else { + try_PATH: + e = ENOENT; +- while ((cmdname = path_advance(&path, argv[0])) != NULL) { ++ while ((cmdname = path_advance(&path, prog)) != NULL) { + if (--idx < 0 && pathopt == NULL) { + tryexec(IF_FEATURE_SH_STANDALONE(-1,) cmdname, argv, envp); + if (errno != ENOENT && errno != ENOTDIR) +@@ -7796,8 +7795,8 @@ shellexec(char **argv, const char *path, int idx) + } + exitstatus = exerrno; + TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n", +- argv[0], e, suppress_int)); +- ash_msg_and_raise(EXEXIT, "%s: %s", argv[0], errmsg(e, "not found")); ++ prog, e, suppress_int)); ++ ash_msg_and_raise(EXEXIT, "%s: %s", prog, errmsg(e, "not found")); + /* NOTREACHED */ + } + +@@ -9371,7 +9370,7 @@ execcmd(int argc UNUSED_PARAM, char **argv) + /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */ + /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */ + +- shellexec(argv + 1, pathval(), 0); ++ shellexec(argv[1], argv + 1, pathval(), 0); + /* NOTREACHED */ + } + return 0; +@@ -9773,7 +9772,7 @@ evalcommand(union node *cmd, int flags) + /* fall through to exec'ing external program */ + } + listsetvar(varlist.list, VEXPORT|VSTACK); +- shellexec(argv, path, cmdentry.u.index); ++ shellexec(argv[0], argv, path, cmdentry.u.index); + /* NOTREACHED */ + } /* default */ + case CMDBUILTIN: +-- +2.9.3 + |