aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-05-19 02:39:54 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:55 +0000
commite9dcd440e4ba1812181839ba803dc0fe2909c43e (patch)
tree7ab6fa5bdc8cad9251fd688a239a6836d994a877
parent166a88f4568067378ddce23b91be7b4ec9a9dfb4 (diff)
downloadklibc-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.c36
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()) {