From owner-freebsd-bugs Sun Oct 13 22:24:30 1996 Return-Path: owner-bugs Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id WAA27098 for bugs-outgoing; Sun, 13 Oct 1996 22:24:30 -0700 (PDT) Received: from fly.HiWAAY.net (sprice@fly.HiWAAY.net [204.214.4.2]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id WAA27088; Sun, 13 Oct 1996 22:24:09 -0700 (PDT) Received: from localhost by fly.HiWAAY.net; (8.7.5/1.1.8.2/21Sep95-1003PM) id AAA15245; Mon, 14 Oct 1996 00:22:34 -0500 (CDT) Date: Mon, 14 Oct 1996 00:22:33 -0500 (CDT) From: Steve Price To: george@cia-g.com cc: freebsd-gnats-submit@FreeBSD.org, GNATS Management , freebsd-bugs@freefall.freebsd.org, sprice@hiwaay.net Subject: Re: bin/1793: /bin/sh return w/o exitstatus in a function sets exitstatus to true In-Reply-To: <199610140306.UAA21113@freefall.freebsd.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-bugs@FreeBSD.org X-Loop: FreeBSD.org Precedence: bulk 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) {