Bug 1793

Summary: /bin/sh return w/o exitstatus in a function sets exitstatus to true
Product: Base System Reporter: george <george>
Component: binAssignee: Martin Cracauer <cracauer>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: Unspecified   
Hardware: Any   
OS: Any   

Description george 1996-10-14 04:10:01 UTC
A return without an exit status in a sh functino sets the exit status
to true.

bash works as does /bin/sh on FreeBSD 2.1.0-RELEASE

Fix: 

use bash?
How-To-Repeat: When the following script is run it echos "True Condition".

#!/bin/sh

Tester()
{
        false
        return
}

if Tester
then
        echo "True Condition"
else
        echo "Not True Condition"
fi
Comment 1 sprice 1996-10-14 06:22:33 UTC
On Sun, 13 Oct 1996 george@cia-g.com wrote:

# 
# >Number:         1793
# >Category:       bin
# >Synopsis:       /bin/sh return w/o exitstatus in a function sets exitstatus to true
# >Confidential:   no
# >Severity:       non-critical
# >Priority:       low
# >Responsible:    freebsd-bugs
# >State:          open
# >Class:          sw-bug
# >Submitter-Id:   current-users
# >Arrival-Date:   Sun Oct 13 20:10:01 PDT 1996
# >Last-Modified:
# >Originator:     George Simunovich
# >Organization:
# >Release:        2.2-current
# >Environment:
# 2.2-CURRENT FreeBSD 2.2-CURRENT #0: Sat Oct 12 13:26:46 MDT 1996
# >Description:
# A return without an exit status in a sh functino sets the exit status
# to true.
# 
# bash works as does /bin/sh on FreeBSD 2.1.0-RELEASE
# >How-To-Repeat:
# When the following script is run it echos "True Condition".
# 
# #!/bin/sh
# 
# Tester()
# {
#         false
#         return
# }
# 
# if Tester
# then
#         echo "True Condition"
# else
#         echo "Not True Condition"
# fi
# 
# >Fix:
# use bash?
# 
# >Audit-Trail:
# >Unformatted:
# 

Try doing a 'return $?' to return the exitstatus of the previously
executed command.  Attached is a one-liner that fixes the case above
but breaks this new case (at least wrt /bin/bash).

steve[~]$ cat > testing
tester()
{
	return
}

false

if tester
then
	echo "true"
else
	echo "false"
fi
^D
steve[~] /tmp/sh testing
true
steve[~] /bin/bash testing
false
steve[~]

I will look into this some more and see what I can find.

Steve

Index: eval.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/eval.c,v
retrieving revision 1.6
diff -u -r1.6 eval.c
--- eval.c       1996/10/06 15:17:19    1.6
+++ eval.c       1996/10/14 05:02:36
@@ -958,7 +958,7 @@
 {
 	int ret;
 
-	ret = exitstatus;
+	ret = oexitstatus;
 	if (argc > 1)
 		ret = number(argv[1]);
 	if (funcnest) {
Comment 2 Steve Price freebsd_committer freebsd_triage 1996-10-16 03:13:58 UTC
Responsible Changed
From-To: freebsd-bugs->steve

I am working on this one. 
Comment 3 Steve Price freebsd_committer freebsd_triage 1998-04-28 13:58:25 UTC
Responsible Changed
From-To: steve->cracauer

Martin said he would take this one. 
Comment 4 Martin Cracauer freebsd_committer freebsd_triage 1998-05-05 14:54:24 UTC
State Changed
From-To: open->closed

This has been fixed when NetBSD changes were imported by Steve in Dec 1996