ash: fix error code regression

The commit 'ash,hush: set exit code 127 in "sh /does/not/exist" case'
only partly implemented the dash commit '[ERROR] Allow the originator
of EXERROR to set the exit status'.  This resulted in incorrect error
codes for a syntax error:

   $ )
   $ echo $?
   0

or a redirection error for a special builtin:

   $ rm -f xxx
   $ eval cat <xxx
   $ echo $?
   0

Signed-off-by: Ron Yorston <rmy@pobox.com>
Reported-by: Martijn Dekker <martijn@inlv.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2017-01-03 11:18:23 +01:00 committed by Denys Vlasenko
parent bddbeb82bf
commit ea7d2f6ec0
5 changed files with 38 additions and 2 deletions

View File

@ -1284,6 +1284,8 @@ ash_msg_and_raise_error(const char *msg, ...)
{ {
va_list ap; va_list ap;
exitstatus = 2;
va_start(ap, msg); va_start(ap, msg);
ash_vmsg_and_raise(EXERROR, msg, ap); ash_vmsg_and_raise(EXERROR, msg, ap);
/* NOTREACHED */ /* NOTREACHED */
@ -9588,11 +9590,13 @@ evalcommand(union node *cmd, int flags)
} }
if (status) { if (status) {
bail:
exitstatus = status;
/* We have a redirection error. */ /* We have a redirection error. */
if (spclbltin > 0) if (spclbltin > 0)
raise_exception(EXERROR); raise_exception(EXERROR);
bail:
exitstatus = status;
goto out; goto out;
} }

View File

@ -0,0 +1,4 @@
./test.sh: line 1: syntax error: unexpected ")"
Done:2
./exitcode2.tests: line 11: can't open does_not_exist: no such file
Done:1

View File

@ -0,0 +1,12 @@
# syntax error should return status 2
cat >test.sh <<EOF
)
EOF
chmod +x test.sh
$THIS_SH ./test.sh
echo Done:$?
rm -f test.sh
# redirection error with special builtin should return status 1
(eval cat <does_not_exist)
echo Done:$?

View File

@ -0,0 +1,4 @@
hush: syntax error: unexpected )
Done:2
hush: can't open 'does_not_exist': No such file or directory
Done:1

View File

@ -0,0 +1,12 @@
# syntax error should return status 2
cat >test.sh <<EOF
)
EOF
chmod +x test.sh
$THIS_SH ./test.sh
echo Done:$?
rm -f test.sh
# redirection error with special builtin should return status 1
(eval cat <does_not_exist)
echo Done:$?