Subject: bin/2504: bin/sh: return returns wrong status
To: None <zuhause!gnats.netbsd.org!gnats-bugs@life.ai.mit.edu>
From: Bruce Albrecht <kksys!zuhause!bruce@life.ai.mit.edu>
List: netbsd-bugs
Date: 06/02/1996 21:06:14
>Number: 2504
>Category: bin
>Synopsis: bin/sh: return returns wrong status
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: bin-bug-people (Utility Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Jun 3 00:20:02 1996
>Last-Modified:
>Originator: Bruce Albrecht
>Organization:
>Release: 1.2_ALPHA
>Environment:
NetBSD 1.2_ALPHA, amiga A3000 68030.
System: NetBSD zuhause 1.2_ALPHA NetBSD 1.2_ALPHA (ZuHause) #0: Sat Jun 1 17:30:48 CDT 1996 bruce@zuhause:/NetBSD-current/netbsd/src/sys/arch/amiga/compile/ZuHause amiga
>Description:
If a function exits with a return command with no parameters, it's suppose to
exit with the error code of the previous command. In NetBSD 1.1 and 1.2_ALPHA
it returns 0.
>How-To-Repeat:
Execute the following file:
t1() {
echo "in t1"
return 29
}
t2() {
echo "in t2"
t1
return
}
echo "in main"
t2
echo "returned $?"
When I run this, I get:
sh ~bruce/treturn
in main
in t2
in t1
returned 0
Instead of 29. This breaks the hylafax-4.0beta13 installation because it's
full of *return* with no arguments.
>Fix:
To tell the truth, I haven't looked at this closely enough to understand why
exitstatus has been reset before eval calls returncmd, and setting a watch on
exitstatus in gdb causes my machine to lock up. This appears to work, though.
*** eval.c.bak Sun Jun 2 19:50:14 1996
--- eval.c Sun Jun 2 18:58:40 1996
***************
*** 951,957 ****
{
int ret;
! ret = exitstatus;
if (argc > 1)
ret = number(argv[1]);
if (funcnest) {
--- 951,957 ----
{
int ret;
! ret = oexitstatus;
if (argc > 1)
ret = number(argv[1]);
if (funcnest) {
>Audit-Trail:
>Unformatted: