aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2020-02-19 15:30:20 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-02-20 09:36:51 +0100
commit54bef2a8efd21e9992a9d26cf30c5b26cbc0e21a (patch)
treed7b25fc37724cbd4fe0820663648a45ed77c9565 /shell
parent7eb8eecbbc752d04381f35d196bbdf1e3b17e2d1 (diff)
downloadbusybox-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.c32
-rw-r--r--shell/ash_test/ash-redir/redir_exec1.right1
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