[git commit] ash: eval: Fail immediately with redirections errors for simple command

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 20 08:36:51 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=54bef2a8efd21e9992a9d26cf30c5b26cbc0e21a
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at gondor.apana.org.au>

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c                                | 32 +++++++++++++++---------------
 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


More information about the busybox-cvs mailing list