diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-19 15:30:20 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-20 09:36:51 +0100 |
commit | 54bef2a8efd21e9992a9d26cf30c5b26cbc0e21a (patch) | |
tree | d7b25fc37724cbd4fe0820663648a45ed77c9565 /shell | |
parent | 7eb8eecbbc752d04381f35d196bbdf1e3b17e2d1 (diff) | |
download | busybox-54bef2a8efd21e9992a9d26cf30c5b26cbc0e21a.tar.gz |
ash: eval: Fail immediately with redirections errors for simple command
Upstream commit:
Date: Sat, 19 May 2018 02:39:54 +0800
eval: Fail immediately with redirections errors for simple command
Previously, dash would continue to perform variable expansions
even if a redirection error occured. This patch changes it so
that it fails immediately.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 32 | ||||
-rw-r--r-- | shell/ash_test/ash-redir/redir_exec1.right | 1 |
2 files changed, 16 insertions, 17 deletions
diff --git a/shell/ash.c b/shell/ash.c index 145896229..5570057e9 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -10253,6 +10253,17 @@ evalcommand(union node *cmd, int flags) } status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2); + if (status) { + bail: + exitstatus = status; + + /* We have a redirection error. */ + if (spclbltin > 0) + raise_exception(EXERROR); + + goto out; + } + for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) { struct strlist **spp; @@ -10304,28 +10315,17 @@ evalcommand(union node *cmd, int flags) ) { find_command(argv[0], &cmdentry, cmd_flag | DO_ERR, path ? path : pathval()); - if (cmdentry.cmdtype == CMDUNKNOWN) { - status = 127; - flush_stdout_stderr(); - goto bail; - } - } - - if (status) { - bail: - exitstatus = status; - - /* We have a redirection error. */ - if (spclbltin > 0) - raise_exception(EXERROR); - - goto out; } jp = NULL; /* Execute the command. */ switch (cmdentry.cmdtype) { + case CMDUNKNOWN: + status = 127; + flush_stdout_stderr(); + goto bail; + default: { #if ENABLE_FEATURE_SH_STANDALONE \ diff --git a/shell/ash_test/ash-redir/redir_exec1.right b/shell/ash_test/ash-redir/redir_exec1.right index c98455bf5..26a664edc 100644 --- a/shell/ash_test/ash-redir/redir_exec1.right +++ b/shell/ash_test/ash-redir/redir_exec1.right @@ -1,2 +1 @@ ./redir_exec1.tests: line 1: can't create /cant/be/created: nonexistent directory -First |