summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-05-19 02:39:54 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2018-05-28 17:12:23 +0800
commit8ca5c96f0c45a4e224193820cb2aaf10059bfb07 (patch)
treee3938bd64b6fb855219dbbe85fea99441c0545b0
parenteval: Add assignment built-in support again (diff)
downloaddash-8ca5c96f0c45a4e224193820cb2aaf10059bfb07.tar.gz
dash-8ca5c96f0c45a4e224193820cb2aaf10059bfb07.zip
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>
-rw-r--r--src/eval.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/eval.c b/src/eval.c
index bdc3893..cda9ab4 100644
--- a/src/eval.c
+++ b/src/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()) {