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>
This commit is contained in:
Denys Vlasenko 2020-02-19 15:30:20 +01:00
parent 7eb8eecbbc
commit 54bef2a8ef
2 changed files with 16 additions and 17 deletions

View File

@ -10253,6 +10253,17 @@ evalcommand(union node *cmd, int flags)
} }
status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2); 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) { for (argp = cmd->ncmd.assign; argp; argp = argp->narg.next) {
struct strlist **spp; struct strlist **spp;
@ -10304,28 +10315,17 @@ evalcommand(union node *cmd, int flags)
) { ) {
find_command(argv[0], &cmdentry, cmd_flag | DO_ERR, find_command(argv[0], &cmdentry, cmd_flag | DO_ERR,
path ? path : pathval()); 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; jp = NULL;
/* Execute the command. */ /* Execute the command. */
switch (cmdentry.cmdtype) { switch (cmdentry.cmdtype) {
case CMDUNKNOWN:
status = 127;
flush_stdout_stderr();
goto bail;
default: { default: {
#if ENABLE_FEATURE_SH_STANDALONE \ #if ENABLE_FEATURE_SH_STANDALONE \

View File

@ -1,2 +1 @@
./redir_exec1.tests: line 1: can't create /cant/be/created: nonexistent directory ./redir_exec1.tests: line 1: can't create /cant/be/created: nonexistent directory
First