diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-19 02:39:54 +0800 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2020-03-28 21:42:55 +0000 |
commit | e9dcd440e4ba1812181839ba803dc0fe2909c43e (patch) | |
tree | 7ab6fa5bdc8cad9251fd688a239a6836d994a877 | |
parent | 166a88f4568067378ddce23b91be7b4ec9a9dfb4 (diff) | |
download | klibc-e9dcd440e4ba1812181839ba803dc0fe2909c43e.tar.gz |
[klibc] dash: eval: Fail immediately with redirections errors for simple command
[ dash commit 8ca5c96f0c45a4e224193820cb2aaf10059bfb07 ]
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: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r-- | usr/dash/eval.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/usr/dash/eval.c b/usr/dash/eval.c index 9e88fef28ac8b..fc5a594a94517 100644 --- a/usr/dash/eval.c +++ b/usr/dash/eval.c @@ -818,6 +818,17 @@ evalcommand(union node *cmd, int flags) redir_stop = pushredir(cmd->ncmd.redirect); status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH|REDIR_SAVEFD2); + if (status) { +bail: + exitstatus = status; + + /* We have a redirection error. */ + if (spclbltin > 0) + exraise(EXERROR); + + goto out; + } + for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) { struct strlist **spp; @@ -848,30 +859,19 @@ evalcommand(union node *cmd, int flags) !(cmdentry.u.cmd->flags & BUILTIN_REGULAR)) { find_command(argv[0], &cmdentry, cmd_flag | DO_ERR, unlikely(path) ? path : pathval()); - if (cmdentry.cmdtype == CMDUNKNOWN) { - status = 127; -#ifdef FLUSHERR - flushout(&errout); -#endif - goto bail; - } - } - - if (status) { -bail: - exitstatus = status; - - /* We have a redirection error. */ - if (spclbltin > 0) - exraise(EXERROR); - - goto out; } jp = NULL; /* Execute the command. */ switch (cmdentry.cmdtype) { + case CMDUNKNOWN: + status = 127; +#ifdef FLUSHERR + flushout(&errout); +#endif + goto bail; + default: /* Fork off a child process if necessary. */ if (!(flags & EV_EXIT) || have_traps()) { |