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:
parent
bddbeb82bf
commit
ea7d2f6ec0
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
shell/ash_test/ash-misc/exitcode2.right
Normal file
4
shell/ash_test/ash-misc/exitcode2.right
Normal 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
|
12
shell/ash_test/ash-misc/exitcode2.tests
Executable file
12
shell/ash_test/ash-misc/exitcode2.tests
Executable 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:$?
|
4
shell/hush_test/hush-misc/exitcode2.right
Normal file
4
shell/hush_test/hush-misc/exitcode2.right
Normal 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
|
12
shell/hush_test/hush-misc/exitcode2.tests
Executable file
12
shell/hush_test/hush-misc/exitcode2.tests
Executable 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:$?
|
Loading…
Reference in New Issue
Block a user