From nobody@FreeBSD.org  Thu Jun 19 07:03:11 2008
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id EC1621065681
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 19 Jun 2008 07:03:10 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id D75868FC29
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 19 Jun 2008 07:03:10 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.2/8.14.2) with ESMTP id m5J73AUL033645
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 19 Jun 2008 07:03:10 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.2/8.14.1/Submit) id m5J73Af5033644;
	Thu, 19 Jun 2008 07:03:10 GMT
	(envelope-from nobody)
Message-Id: <200806190703.m5J73Af5033644@www.freebsd.org>
Date: Thu, 19 Jun 2008 07:03:10 GMT
From: Garrett Cooper <yaneurabeya@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         124748
>Category:       bin
>Synopsis:       [patch] sh(1): sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jun 19 07:10:01 UTC 2008
>Closed-Date:    Thu Sep 10 19:42:53 UTC 2009
>Last-Modified:  Sun Feb 03 22:27:42 UTC 2013
>Originator:     Garrett Cooper
>Release:        8-CURRENT
>Organization:
n/a
>Environment:
FreeBSD optimus 8.0-CURRENT FreeBSD 8.0-CURRENT #6: Mon Jun  9 20:41:28 PDT 2008     root@optimus:/usr/obj/usr/src/sys/OPTIMUS  i386

>Description:
Bourne shell (/bin/sh), as it stands, doesn't parse numbers properly, even though bash does:

[gcooper@optimus /devel/ncvs/src/bin/sh]$ sh -c 'exit -1'
exit: Illegal number: -1
[gcooper@optimus /devel/ncvs/src/bin/sh]$ sh -c 'exit +1'
exit: Illegal number: +1

These are valid numbers though, which are merely red herrings; the patch attached does fix this behavior though, according to the following gamut of tests:

[gcooper@optimus /devel/ncvs/src/bin/sh]$ cat number_test.sh
#!/bin/sh

for shell in sh $@; do
        for i in -1 1 +1; do
                echo "$shell -c \"exit $i\""
                $shell -c "exit $i"; echo $?
        done;
done
# End of test
[gcooper@optimus /devel/ncvs/src/bin/sh]$ ./number_test.sh bash ./sh
sh -c "exit -1"
exit: Illegal number: -1
2
sh -c "exit 1"
1
sh -c "exit +1"
exit: Illegal number: +1
2
bash -c "exit -1"
255
bash -c "exit 1"
1
bash -c "exit +1"
1
./sh -c "exit -1"
255
./sh -c "exit 1"
1
./sh -c "exit +1"
1
>How-To-Repeat:
/bin/sh -c "exit -1"
/bin/sh -c "exit +1"
>Fix:
Patch attached (also fixes histcmd.c and trap.c -- strange thing is that I can't seem to test that builtin cmd), and maintains proper compatibility with builtin jobs:

[gcooper@optimus /devel/ncvs/src/bin/sh]$ sh -c 'builtin histcmd'
histcmd: not found

Patch attached with submission follows:

Index: exec.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/exec.c,v
retrieving revision 1.31
diff -r1.31 exec.c
40a41
> #include <string.h>
361c362
< 			if (prefix("builtin", pathopt)) {
---
> 			if (strncmp(BUILTIN, pathopt, strlen(BUILTIN)) == 0) {
Index: histedit.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/histedit.c,v
retrieving revision 1.29
diff -r1.29 histedit.c
425,426d424
< 	if (*s == '-')
< 		s++;
Index: jobs.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/jobs.c,v
retrieving revision 1.72
diff -r1.72 jobs.c
534c534
< 		return (jp);
---
> 		return jp;
540c540,544
< 			jobno = number(name + 1);
---
> 			/*
> 			 * Don't use number() here. This breaks existing
> 			 * jobs(1) compatibility.
> 			 */
> 			jobno = atoi(name + 1);
560c564
< 					if (found)
---
> 					if (found != NULL)
571,572c575,576
< 				 && prefix(name + 1, jp->ps[0].cmd)) {
< 					if (found)
---
> 				 && strncmp(name+1, jp->ps[0].cmd, strlen(name+1))) {
> 					if (found != NULL)
577,578c581,582
< 			if (found)
< 				return found;
---
> 			if (found != NULL)
> 				return (found);
581c585,586
< 		pid = (pid_t)number(name);
---
> 		/* no need to run is_number() again with number() */
> 		pid = (pid_t)atoi(name);
Index: main.h
===================================================================
RCS file: /home/ncvs/src/bin/sh/main.h,v
retrieving revision 1.8
diff -r1.8 main.h
38a39,40
> #define BUILTIN "builtin"
> 
Index: mystring.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/mystring.c,v
retrieving revision 1.13
diff -r1.13 mystring.c
56a57,59
> #if DEBUG
> #include <stdio.h>
> #endif
123a127,135
> 	/* Is this the first index? */
> 	int iter = 0;
> 
> #if DEBUG
> #define PRINT_DEBUG fprintf(stderr, "%d: %c\n", iter, *p)
> #else
> #define PRINT_DEBUG  
> #endif
> 
125c137,154
< 		if (! is_digit(*p))
---
> 		/*
> 		 * Account for signs in front of numbers.
> 		 */
> 
> 		/*
> 		 * XXX: does POSIX bourne shell allow for '+' prefixed
> 		 * numbers?
> 		 */
> 
> 		/*
> 		 * The string defined by *p isn't a number, unless:
> 		 * 	1. It's a digit.
> 		 * 	2. The 0'th index is either a + or -.
> 		 */
> 		if (!(is_digit(*p) ||
> 		     (iter == 0 && (*p == '-' || *p == '+')))
> 		) {
> 			PRINT_DEBUG;
126a156,163
> 		}
> 
> 		PRINT_DEBUG;
> 
> #undef PRINT_DEBUG
> 
> 		iter++;
> 


>Release-Note:
>Audit-Trail:

From: Edwin Groothuis <edwin@mavetju.org>
To: Garrett Cooper <yaneurabeya@gmail.com>
Cc: FreeBSD Gnats Submit <freebsd-gnats-submit@freebsd.org>
Subject: Re: misc/124748: sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
Date: Fri, 20 Jun 2008 07:45:22 +1000

 On Thu, Jun 19, 2008 at 07:03:10AM +0000, Garrett Cooper wrote:
 > ===================================================================
 > RCS file: /home/ncvs/src/bin/sh/exec.c,v
 > retrieving revision 1.31
 > diff -r1.31 exec.c
 > 40a41
 > > #include <string.h>
 > 361c362
 > < 			if (prefix("builtin", pathopt)) {
 > ---
 > > 			if (strncmp(BUILTIN, pathopt, strlen(BUILTIN)) == 0) {
 > Index: histedit.c
 > ===================================================================
 
 I don't want to be a pain, but could you do this with "diff -u" in
 case there is some context required?
 
 Edwin
 -- 
 Edwin Groothuis      |            Personal website: http://www.mavetju.org
 edwin@mavetju.org    |              Weblog: http://www.mavetju.org/weblog/

From: "Garrett Cooper" <gcooper@FreeBSD.org>
To: "Edwin Groothuis" <edwin@mavetju.org>
Cc: "FreeBSD Gnats Submit" <freebsd-gnats-submit@freebsd.org>
Subject: Re: misc/124748: sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
Date: Thu, 19 Jun 2008 15:18:31 -0700

 On Thu, Jun 19, 2008 at 2:45 PM, Edwin Groothuis <edwin@mavetju.org> wrote:
 > On Thu, Jun 19, 2008 at 07:03:10AM +0000, Garrett Cooper wrote:
 >> ===================================================================
 >> RCS file: /home/ncvs/src/bin/sh/exec.c,v
 >> retrieving revision 1.31
 >> diff -r1.31 exec.c
 >> 40a41
 >> > #include <string.h>
 >> 361c362
 >> <                     if (prefix("builtin", pathopt)) {
 >> ---
 >> >                     if (strncmp(BUILTIN, pathopt, strlen(BUILTIN)) == 0) {
 >> Index: histedit.c
 >> ===================================================================
 >
 > I don't want to be a pain, but could you do this with "diff -u" in
 > case there is some context required?
 >
 > Edwin
 
 Will do once I get home.
 -Garrett

From: "Garrett Cooper" <gcooper@FreeBSD.org>
To: "Garrett Cooper" <gcooper@freebsd.org>
Cc: "Edwin Groothuis" <edwin@mavetju.org>, 
	"FreeBSD Gnats Submit" <freebsd-gnats-submit@freebsd.org>
Subject: Re: misc/124748: sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
Date: Thu, 19 Jun 2008 17:44:29 -0700

 ------=_Part_7292_27631637.1213922669108
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 On Thu, Jun 19, 2008 at 3:18 PM, Garrett Cooper <yaneurabeya@gmail.com> wrote:
 > On Thu, Jun 19, 2008 at 2:45 PM, Edwin Groothuis <edwin@mavetju.org> wrote:
 >> On Thu, Jun 19, 2008 at 07:03:10AM +0000, Garrett Cooper wrote:
 >>> ===================================================================
 >>> RCS file: /home/ncvs/src/bin/sh/exec.c,v
 >>> retrieving revision 1.31
 >>> diff -r1.31 exec.c
 >>> 40a41
 >>> > #include <string.h>
 >>> 361c362
 >>> <                     if (prefix("builtin", pathopt)) {
 >>> ---
 >>> >                     if (strncmp(BUILTIN, pathopt, strlen(BUILTIN)) == 0) {
 >>> Index: histedit.c
 >>> ===================================================================
 >>
 >> I don't want to be a pain, but could you do this with "diff -u" in
 >> case there is some context required?
 >>
 >> Edwin
 >
 > Will do once I get home.
 > -Garrett
 
 Here's a new patch.
 -Garrett
 
 ------=_Part_7292_27631637.1213922669108
 Content-Type: text/x-patch; name=sh_fix_numbers.patch
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_fho27fxf0
 Content-Disposition: attachment; filename=sh_fix_numbers.patch
 
 SW5kZXg6IGV4ZWMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9uY3ZzL3NyYy9iaW4vc2gv
 ZXhlYy5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjMxCmRpZmYgLXUgLXIxLjMxIGV4ZWMuYwot
 LS0gZXhlYy5jCTE4IEphbiAyMDA3IDIyOjMxOjIyIC0wMDAwCTEuMzEKKysrIGV4ZWMuYwkyMCBK
 dW4gMjAwOCAwMDo0MDoxNiAtMDAwMApAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPHN5cy9j
 ZGVmcy5oPgogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvYmluL3NoL2V4ZWMuYyx2IDEuMzEgMjAw
 Ny8wMS8xOCAyMjozMToyMiBzdGVmYW5mIEV4cCAkIik7CiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4K
 ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUg
 PHVuaXN0ZC5oPgpAQCAtMzU4LDcgKzM1OSw3IEBACiAJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CiAJ
 CWluZGV4Kys7CiAJCWlmIChwYXRob3B0KSB7Ci0JCQlpZiAocHJlZml4KCJidWlsdGluIiwgcGF0
 aG9wdCkpIHsKKwkJCWlmIChzdHJuY21wKEJVSUxUSU4sIHBhdGhvcHQsIHN0cmxlbihCVUlMVElO
 KSkgPT0gMCkgewogCQkJCWlmICgoaSA9IGZpbmRfYnVpbHRpbihuYW1lLCAmc3BlYykpIDwgMCkK
 IAkJCQkJZ290byBsb29wOwogCQkJCUlOVE9GRjsKSW5kZXg6IGhpc3RlZGl0LmMKPT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PQpSQ1MgZmlsZTogL2hvbWUvbmN2cy9zcmMvYmluL3NoL2hpc3RlZGl0LmMsdgpyZXRyaWV2aW5n
 IHJldmlzaW9uIDEuMjkKZGlmZiAtdSAtcjEuMjkgaGlzdGVkaXQuYwotLS0gaGlzdGVkaXQuYwk0
 IEF1ZyAyMDA2IDA3OjU2OjMxIC0wMDAwCTEuMjkKKysrIGhpc3RlZGl0LmMJMjAgSnVuIDIwMDgg
 MDA6NDA6MTYgLTAwMDAKQEAgLTQyMiw4ICs0MjIsNiBAQAogewogCWlmIChzID09IE5VTEwpCiAJ
 CXJldHVybiAoMCk7Ci0JaWYgKCpzID09ICctJykKLQkJcysrOwogCXJldHVybiAoIWlzX251bWJl
 cihzKSk7CiB9CiAKSW5kZXg6IGpvYnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9uY3Zz
 L3NyYy9iaW4vc2gvam9icy5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjcyCmRpZmYgLXUgLXIx
 LjcyIGpvYnMuYwotLS0gam9icy5jCTcgT2N0IDIwMDYgMTY6NTE6MTYgLTAwMDAJMS43MgorKysg
 am9icy5jCTIwIEp1biAyMDA4IDAwOjQwOjE3IC0wMDAwCkBAIC01MzEsMTMgKzUzMSwxNyBAQAog
 I2lmIEpPQlMKIGN1cnJlbnRqb2I6CWlmICgoanAgPSBnZXRjdXJqb2IoTlVMTCkpID09IE5VTEwp
 CiAJCQllcnJvcigiTm8gY3VycmVudCBqb2IiKTsKLQkJcmV0dXJuIChqcCk7CisJCXJldHVybiBq
 cDsKICNlbHNlCiAJCWVycm9yKCJObyBjdXJyZW50IGpvYiIpOwogI2VuZGlmCiAJfSBlbHNlIGlm
 IChuYW1lWzBdID09ICclJykgewogCQlpZiAoaXNfZGlnaXQobmFtZVsxXSkpIHsKLQkJCWpvYm5v
 ID0gbnVtYmVyKG5hbWUgKyAxKTsKKwkJCS8qCisJCQkgKiBEb24ndCB1c2UgbnVtYmVyKCkgaGVy
 ZS4gVGhpcyBicmVha3MgZXhpc3RpbmcKKwkJCSAqIGpvYnMoMSkgY29tcGF0aWJpbGl0eS4KKwkJ
 CSAqLworCQkJam9ibm8gPSBhdG9pKG5hbWUgKyAxKTsKIAkJCWlmIChqb2JubyA+IDAgJiYgam9i
 bm8gPD0gbmpvYnMKIAkJCSAmJiBqb2J0YWJbam9ibm8gLSAxXS51c2VkICE9IDApCiAJCQkJcmV0
 dXJuICZqb2J0YWJbam9ibm8gLSAxXTsKQEAgLTU1Nyw3ICs1NjEsNyBAQAogCQkJZm9yIChqcCA9
 IGpvYnRhYiwgaSA9IG5qb2JzIDsgLS1pID49IDAgOyBqcCsrKSB7CiAJCQkJaWYgKGpwLT51c2Vk
 ICYmIGpwLT5ucHJvY3MgPiAwCiAJCQkJICYmIHN0cnN0cihqcC0+cHNbMF0uY21kLCBuYW1lICsg
 MikgIT0gTlVMTCkgewotCQkJCQlpZiAoZm91bmQpCisJCQkJCWlmIChmb3VuZCAhPSBOVUxMKQog
 CQkJCQkJZXJyb3IoIiVzOiBhbWJpZ3VvdXMiLCBuYW1lKTsKIAkJCQkJZm91bmQgPSBqcDsKIAkJ
 CQl9CkBAIC01NjgsMTcgKzU3MiwxOCBAQAogCQkJZm91bmQgPSBOVUxMOwogCQkJZm9yIChqcCA9
 IGpvYnRhYiwgaSA9IG5qb2JzIDsgLS1pID49IDAgOyBqcCsrKSB7CiAJCQkJaWYgKGpwLT51c2Vk
 ICYmIGpwLT5ucHJvY3MgPiAwCi0JCQkJICYmIHByZWZpeChuYW1lICsgMSwganAtPnBzWzBdLmNt
 ZCkpIHsKLQkJCQkJaWYgKGZvdW5kKQorCQkJCSAmJiBzdHJuY21wKG5hbWUrMSwganAtPnBzWzBd
 LmNtZCwgc3RybGVuKG5hbWUrMSkpKSB7CisJCQkJCWlmIChmb3VuZCAhPSBOVUxMKQogCQkJCQkJ
 ZXJyb3IoIiVzOiBhbWJpZ3VvdXMiLCBuYW1lKTsKIAkJCQkJZm91bmQgPSBqcDsKIAkJCQl9CiAJ
 CQl9Ci0JCQlpZiAoZm91bmQpCi0JCQkJcmV0dXJuIGZvdW5kOworCQkJaWYgKGZvdW5kICE9IE5V
 TEwpCisJCQkJcmV0dXJuIChmb3VuZCk7CiAJCX0KIAl9IGVsc2UgaWYgKGlzX251bWJlcihuYW1l
 KSkgewotCQlwaWQgPSAocGlkX3QpbnVtYmVyKG5hbWUpOworCQkvKiBubyBuZWVkIHRvIHJ1biBp
 c19udW1iZXIoKSBhZ2FpbiB3aXRoIG51bWJlcigpICovCisJCXBpZCA9IChwaWRfdClhdG9pKG5h
 bWUpOwogCQlmb3IgKGpwID0gam9idGFiLCBpID0gbmpvYnMgOyAtLWkgPj0gMCA7IGpwKyspIHsK
 IAkJCWlmIChqcC0+dXNlZCAmJiBqcC0+bnByb2NzID4gMAogCQkJICYmIGpwLT5wc1tqcC0+bnBy
 b2NzIC0gMV0ucGlkID09IHBpZCkKSW5kZXg6IG1haW4uaAo9PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAv
 aG9tZS9uY3ZzL3NyYy9iaW4vc2gvbWFpbi5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjgKZGlm
 ZiAtdSAtcjEuOCBtYWluLmgKLS0tIG1haW4uaAk2IEFwciAyMDA0IDIwOjA2OjUxIC0wMDAwCTEu
 OAorKysgbWFpbi5oCTIwIEp1biAyMDA4IDAwOjQwOjE3IC0wMDAwCkBAIC0zNiw2ICszNiw4IEBA
 CiBleHRlcm4gaW50IHJvb3RwaWQ7CS8qIHBpZCBvZiBtYWluIHNoZWxsICovCiBleHRlcm4gaW50
 IHJvb3RzaGVsbDsJLyogdHJ1ZSBpZiB3ZSBhcmVuJ3QgYSBjaGlsZCBvZiB0aGUgbWFpbiBzaGVs
 bCAqLwogCisjZGVmaW5lIEJVSUxUSU4gImJ1aWx0aW4iCisKIHZvaWQgcmVhZGNtZGZpbGUoY2hh
 ciAqKTsKIHZvaWQgY21kbG9vcChpbnQpOwogaW50IGRvdGNtZChpbnQsIGNoYXIgKiopOwpJbmRl
 eDogbXlzdHJpbmcuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9uY3ZzL3NyYy9iaW4vc2gv
 bXlzdHJpbmcuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC11IC1yMS4xMyBteXN0
 cmluZy5jCi0tLSBteXN0cmluZy5jCTYgQXByIDIwMDQgMjA6MDY6NTEgLTAwMDAJMS4xMworKysg
 bXlzdHJpbmcuYwkyMCBKdW4gMjAwOCAwMDo0MDoxNyAtMDAwMApAQCAtNTQsNiArNTQsOSBAQAog
 I2luY2x1ZGUgImVycm9yLmgiCiAjaW5jbHVkZSAibXlzdHJpbmcuaCIKIAorI2lmIERFQlVHCisj
 aW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgogCiBjaGFyIG51bGxzdHJbMV07CQkvKiB6ZXJvIGxl
 bmd0aCBzdHJpbmcgKi8KIApAQCAtMTIxLDkgKzEyNCw0MyBAQAogaW50CiBpc19udW1iZXIoY29u
 c3QgY2hhciAqcCkKIHsKKwkvKiBJcyB0aGlzIHRoZSBmaXJzdCBpbmRleD8gKi8KKwlpbnQgaXRl
 ciA9IDA7CisKKyNpZiBERUJVRworI2RlZmluZSBQUklOVF9ERUJVRyBmcHJpbnRmKHN0ZGVyciwg
 IiVkOiAlY1xuIiwgaXRlciwgKnApCisjZWxzZQorI2RlZmluZSBQUklOVF9ERUJVRyAgCisjZW5k
 aWYKKwogCWRvIHsKLQkJaWYgKCEgaXNfZGlnaXQoKnApKQorCQkvKgorCQkgKiBBY2NvdW50IGZv
 ciBzaWducyBpbiBmcm9udCBvZiBudW1iZXJzLgorCQkgKi8KKworCQkvKgorCQkgKiBYWFg6IGRv
 ZXMgUE9TSVggYm91cm5lIHNoZWxsIGFsbG93IGZvciAnKycgcHJlZml4ZWQKKwkJICogbnVtYmVy
 cz8KKwkJICovCisKKwkJLyoKKwkJICogVGhlIHN0cmluZyBkZWZpbmVkIGJ5ICpwIGlzbid0IGEg
 bnVtYmVyLCB1bmxlc3M6CisJCSAqIAkxLiBJdCdzIGEgZGlnaXQuCisJCSAqIAkyLiBUaGUgMCd0
 aCBpbmRleCBpcyBlaXRoZXIgYSArIG9yIC0uCisJCSAqLworCQlpZiAoIShpc19kaWdpdCgqcCkg
 fHwKKwkJICAgICAoaXRlciA9PSAwICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkpCisJCSkg
 eworCQkJUFJJTlRfREVCVUc7CiAJCQlyZXR1cm4gMDsKKwkJfQorCisJCVBSSU5UX0RFQlVHOwor
 CisjdW5kZWYgUFJJTlRfREVCVUcKKworCQlpdGVyKys7CisKIAl9IHdoaWxlICgqKytwICE9ICdc
 MCcpOwogCXJldHVybiAxOwogfQo=
 ------=_Part_7292_27631637.1213922669108--

From: "Garrett Cooper" <gcooper@FreeBSD.org>
To: "Garrett Cooper" <gcooper@freebsd.org>
Cc: "Edwin Groothuis" <edwin@mavetju.org>, 
	"FreeBSD Gnats Submit" <freebsd-gnats-submit@freebsd.org>
Subject: Re: misc/124748: sh -c 'exit -1' fails with "Illegal number: -1", instead of exiting with a code of 255
Date: Thu, 19 Jun 2008 18:06:36 -0700

 ------=_Part_7301_29624223.1213923996732
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 On Thu, Jun 19, 2008 at 5:44 PM, Garrett Cooper <yaneurabeya@gmail.com> wrote:
 > On Thu, Jun 19, 2008 at 3:18 PM, Garrett Cooper <yaneurabeya@gmail.com> wrote:
 >> On Thu, Jun 19, 2008 at 2:45 PM, Edwin Groothuis <edwin@mavetju.org> wrote:
 >>> On Thu, Jun 19, 2008 at 07:03:10AM +0000, Garrett Cooper wrote:
 >>>> ===================================================================
 >>>> RCS file: /home/ncvs/src/bin/sh/exec.c,v
 >>>> retrieving revision 1.31
 >>>> diff -r1.31 exec.c
 >>>> 40a41
 >>>> > #include <string.h>
 >>>> 361c362
 >>>> <                     if (prefix("builtin", pathopt)) {
 >>>> ---
 >>>> >                     if (strncmp(BUILTIN, pathopt, strlen(BUILTIN)) == 0) {
 >>>> Index: histedit.c
 >>>> ===================================================================
 >>>
 >>> I don't want to be a pain, but could you do this with "diff -u" in
 >>> case there is some context required?
 >>>
 >>> Edwin
 >>
 >> Will do once I get home.
 >> -Garrett
 >
 > Here's a new patch.
 > -Garrett
 
 Ah, I forgot -- some of the functions within sh/mystring.c could be
 replaced with libc equivalents. One was prefix() <-> strncmp().
 Here's a similar patch, minus prefix().
 -Garrett
 
 ------=_Part_7301_29624223.1213923996732
 Content-Type: text/x-patch; name=sh_fix_numbers.patch
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_fho2zmny0
 Content-Disposition: attachment; filename=sh_fix_numbers.patch
 
 SW5kZXg6IGV4ZWMuYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL2Jpbi9z
 aC9leGVjLmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjMxDQpkaWZmIC11IC1yMS4zMSBleGVj
 LmMNCi0tLSBleGVjLmMJMTggSmFuIDIwMDcgMjI6MzE6MjIgLTAwMDAJMS4zMQ0KKysrIGV4ZWMu
 YwkyMCBKdW4gMjAwOCAwMDo1ODo0NiAtMDAwMA0KQEAgLTM4LDYgKzM4LDcgQEANCiAjaW5jbHVk
 ZSA8c3lzL2NkZWZzLmg+DQogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvYmluL3NoL2V4ZWMuYyx2
 IDEuMzEgMjAwNy8wMS8xOCAyMjozMToyMiBzdGVmYW5mIEV4cCAkIik7DQogDQorI2luY2x1ZGUg
 PHN0cmluZy5oPg0KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiAjaW5jbHVkZSA8c3lzL3N0YXQu
 aD4NCiAjaW5jbHVkZSA8dW5pc3RkLmg+DQpAQCAtMzU4LDcgKzM1OSw3IEBADQogCQlzdHVuYWxs
 b2MoZnVsbG5hbWUpOw0KIAkJaW5kZXgrKzsNCiAJCWlmIChwYXRob3B0KSB7DQotCQkJaWYgKHBy
 ZWZpeCgiYnVpbHRpbiIsIHBhdGhvcHQpKSB7DQorCQkJaWYgKHN0cm5jbXAoQlVJTFRJTiwgcGF0
 aG9wdCwgc3RybGVuKEJVSUxUSU4pKSA9PSAwKSB7DQogCQkJCWlmICgoaSA9IGZpbmRfYnVpbHRp
 bihuYW1lLCAmc3BlYykpIDwgMCkNCiAJCQkJCWdvdG8gbG9vcDsNCiAJCQkJSU5UT0ZGOw0KQEAg
 LTM2OCw3ICszNjksNyBAQA0KIAkJCQljbWRwLT5zcGVjaWFsID0gc3BlYzsNCiAJCQkJSU5UT047
 DQogCQkJCWdvdG8gc3VjY2VzczsNCi0JCQl9IGVsc2UgaWYgKHByZWZpeCgiZnVuYyIsIHBhdGhv
 cHQpKSB7DQorCQkJfSBlbHNlIGlmIChzdHJuY21wKEZVTkMsIHBhdGhvcHQsIHN0cmxlbihGVU5D
 KSkgPT0gMCkgew0KIAkJCQkvKiBoYW5kbGVkIGJlbG93ICovDQogCQkJfSBlbHNlIHsNCiAJCQkJ
 Z290byBsb29wOwkvKiBpZ25vcmUgdW5pbXBsZW1lbnRlZCBvcHRpb25zICovDQpAQCAtNTEwLDcg
 KzUxMSw3IEBADQogCQl9DQogCQlpZiAoKm5ldyA9PSAnXDAnKQ0KIAkJCWJyZWFrOw0KLQkJaWYg
 KCpuZXcgPT0gJyUnICYmIGJsdGluIDwgMCAmJiBwcmVmaXgoImJ1aWx0aW4iLCBuZXcgKyAxKSkN
 CisJCWlmICgqbmV3ID09ICclJyAmJiBibHRpbiA8IDAgJiYgc3RybmNtcChCVUlMVElOLCBuZXcg
 KyAxLCBzdHJsZW4oQlVJTFRJTikgPT0gMCkpDQogCQkJYmx0aW4gPSBpbmRleDsNCiAJCWlmICgq
 bmV3ID09ICc6Jykgew0KIAkJCWluZGV4Kys7DQpJbmRleDogaGlzdGVkaXQuYw0KPT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL2Jpbi9zaC9oaXN0ZWRpdC5jLHYNCnJldHJpZXZp
 bmcgcmV2aXNpb24gMS4yOQ0KZGlmZiAtdSAtcjEuMjkgaGlzdGVkaXQuYw0KLS0tIGhpc3RlZGl0
 LmMJNCBBdWcgMjAwNiAwNzo1NjozMSAtMDAwMAkxLjI5DQorKysgaGlzdGVkaXQuYwkyMCBKdW4g
 MjAwOCAwMDo1ODo0NiAtMDAwMA0KQEAgLTQyMiw4ICs0MjIsNiBAQA0KIHsNCiAJaWYgKHMgPT0g
 TlVMTCkNCiAJCXJldHVybiAoMCk7DQotCWlmICgqcyA9PSAnLScpDQotCQlzKys7DQogCXJldHVy
 biAoIWlzX251bWJlcihzKSk7DQogfQ0KIA0KSW5kZXg6IGpvYnMuYw0KPT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNT
 IGZpbGU6IC9ob21lL25jdnMvc3JjL2Jpbi9zaC9qb2JzLmMsdg0KcmV0cmlldmluZyByZXZpc2lv
 biAxLjcyDQpkaWZmIC11IC1yMS43MiBqb2JzLmMNCi0tLSBqb2JzLmMJNyBPY3QgMjAwNiAxNjo1
 MToxNiAtMDAwMAkxLjcyDQorKysgam9icy5jCTIwIEp1biAyMDA4IDAwOjU4OjQ3IC0wMDAwDQpA
 QCAtNTMxLDEzICs1MzEsMTcgQEANCiAjaWYgSk9CUw0KIGN1cnJlbnRqb2I6CWlmICgoanAgPSBn
 ZXRjdXJqb2IoTlVMTCkpID09IE5VTEwpDQogCQkJZXJyb3IoIk5vIGN1cnJlbnQgam9iIik7DQot
 CQlyZXR1cm4gKGpwKTsNCisJCXJldHVybiBqcDsNCiAjZWxzZQ0KIAkJZXJyb3IoIk5vIGN1cnJl
 bnQgam9iIik7DQogI2VuZGlmDQogCX0gZWxzZSBpZiAobmFtZVswXSA9PSAnJScpIHsNCiAJCWlm
 IChpc19kaWdpdChuYW1lWzFdKSkgew0KLQkJCWpvYm5vID0gbnVtYmVyKG5hbWUgKyAxKTsNCisJ
 CQkvKg0KKwkJCSAqIERvbid0IHVzZSBudW1iZXIoKSBoZXJlLiBUaGlzIGJyZWFrcyBleGlzdGlu
 Zw0KKwkJCSAqIGpvYnMoMSkgY29tcGF0aWJpbGl0eS4NCisJCQkgKi8NCisJCQlqb2JubyA9IGF0
 b2kobmFtZSArIDEpOw0KIAkJCWlmIChqb2JubyA+IDAgJiYgam9ibm8gPD0gbmpvYnMNCiAJCQkg
 JiYgam9idGFiW2pvYm5vIC0gMV0udXNlZCAhPSAwKQ0KIAkJCQlyZXR1cm4gJmpvYnRhYltqb2Ju
 byAtIDFdOw0KQEAgLTU1Nyw3ICs1NjEsNyBAQA0KIAkJCWZvciAoanAgPSBqb2J0YWIsIGkgPSBu
 am9icyA7IC0taSA+PSAwIDsganArKykgew0KIAkJCQlpZiAoanAtPnVzZWQgJiYganAtPm5wcm9j
 cyA+IDANCiAJCQkJICYmIHN0cnN0cihqcC0+cHNbMF0uY21kLCBuYW1lICsgMikgIT0gTlVMTCkg
 ew0KLQkJCQkJaWYgKGZvdW5kKQ0KKwkJCQkJaWYgKGZvdW5kICE9IE5VTEwpDQogCQkJCQkJZXJy
 b3IoIiVzOiBhbWJpZ3VvdXMiLCBuYW1lKTsNCiAJCQkJCWZvdW5kID0ganA7DQogCQkJCX0NCkBA
 IC01NjgsMTcgKzU3MiwxOCBAQA0KIAkJCWZvdW5kID0gTlVMTDsNCiAJCQlmb3IgKGpwID0gam9i
 dGFiLCBpID0gbmpvYnMgOyAtLWkgPj0gMCA7IGpwKyspIHsNCiAJCQkJaWYgKGpwLT51c2VkICYm
 IGpwLT5ucHJvY3MgPiAwDQotCQkJCSAmJiBwcmVmaXgobmFtZSArIDEsIGpwLT5wc1swXS5jbWQp
 KSB7DQotCQkJCQlpZiAoZm91bmQpDQorCQkJCSAmJiBzdHJuY21wKG5hbWUrMSwganAtPnBzWzBd
 LmNtZCwgc3RybGVuKG5hbWUrMSkpKSB7DQorCQkJCQlpZiAoZm91bmQgIT0gTlVMTCkNCiAJCQkJ
 CQllcnJvcigiJXM6IGFtYmlndW91cyIsIG5hbWUpOw0KIAkJCQkJZm91bmQgPSBqcDsNCiAJCQkJ
 fQ0KIAkJCX0NCi0JCQlpZiAoZm91bmQpDQotCQkJCXJldHVybiBmb3VuZDsNCisJCQlpZiAoZm91
 bmQgIT0gTlVMTCkNCisJCQkJcmV0dXJuIChmb3VuZCk7DQogCQl9DQogCX0gZWxzZSBpZiAoaXNf
 bnVtYmVyKG5hbWUpKSB7DQotCQlwaWQgPSAocGlkX3QpbnVtYmVyKG5hbWUpOw0KKwkJLyogbm8g
 bmVlZCB0byBydW4gaXNfbnVtYmVyKCkgYWdhaW4gd2l0aCBudW1iZXIoKSAqLw0KKwkJcGlkID0g
 KHBpZF90KWF0b2kobmFtZSk7DQogCQlmb3IgKGpwID0gam9idGFiLCBpID0gbmpvYnMgOyAtLWkg
 Pj0gMCA7IGpwKyspIHsNCiAJCQlpZiAoanAtPnVzZWQgJiYganAtPm5wcm9jcyA+IDANCiAJCQkg
 JiYganAtPnBzW2pwLT5ucHJvY3MgLSAxXS5waWQgPT0gcGlkKQ0KSW5kZXg6IG1haW4uaA0KPT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL2Jpbi9zaC9tYWluLmgsdg0KcmV0cmll
 dmluZyByZXZpc2lvbiAxLjgNCmRpZmYgLXUgLXIxLjggbWFpbi5oDQotLS0gbWFpbi5oCTYgQXBy
 IDIwMDQgMjA6MDY6NTEgLTAwMDAJMS44DQorKysgbWFpbi5oCTIwIEp1biAyMDA4IDAwOjU4OjQ3
 IC0wMDAwDQpAQCAtMzYsNiArMzYsOSBAQA0KIGV4dGVybiBpbnQgcm9vdHBpZDsJLyogcGlkIG9m
 IG1haW4gc2hlbGwgKi8NCiBleHRlcm4gaW50IHJvb3RzaGVsbDsJLyogdHJ1ZSBpZiB3ZSBhcmVu
 J3QgYSBjaGlsZCBvZiB0aGUgbWFpbiBzaGVsbCAqLw0KIA0KKyNkZWZpbmUgQlVJTFRJTiAiYnVp
 bHRpbiINCisjZGVmaW5lIEZVTkMgImZ1bmMiDQorDQogdm9pZCByZWFkY21kZmlsZShjaGFyICop
 Ow0KIHZvaWQgY21kbG9vcChpbnQpOw0KIGludCBkb3RjbWQoaW50LCBjaGFyICoqKTsNCkluZGV4
 OiBteXN0cmluZy5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2hvbWUvbmN2cy9zcmMvYmluL3No
 L215c3RyaW5nLmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjEzDQpkaWZmIC11IC1yMS4xMyBt
 eXN0cmluZy5jDQotLS0gbXlzdHJpbmcuYwk2IEFwciAyMDA0IDIwOjA2OjUxIC0wMDAwCTEuMTMN
 CisrKyBteXN0cmluZy5jCTIwIEp1biAyMDA4IDAwOjU4OjQ3IC0wMDAwDQpAQCAtNTQsNiArNTQs
 OSBAQA0KICNpbmNsdWRlICJlcnJvci5oIg0KICNpbmNsdWRlICJteXN0cmluZy5oIg0KIA0KKyNp
 ZiBERUJVRw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNlbmRpZg0KIA0KIGNoYXIgbnVsbHN0clsx
 XTsJCS8qIHplcm8gbGVuZ3RoIHN0cmluZyAqLw0KIA0KQEAgLTgzLDIyICs4Niw2IEBADQogCSp0
 byA9ICdcMCc7DQogfQ0KIA0KLQ0KLS8qDQotICogcHJlZml4IC0tIHNlZSBpZiBwZnggaXMgYSBw
 cmVmaXggb2Ygc3RyaW5nLg0KLSAqLw0KLQ0KLWludA0KLXByZWZpeChjb25zdCBjaGFyICpwZngs
 IGNvbnN0IGNoYXIgKnN0cmluZykNCi17DQotCXdoaWxlICgqcGZ4KSB7DQotCQlpZiAoKnBmeCsr
 ICE9ICpzdHJpbmcrKykNCi0JCQlyZXR1cm4gMDsNCi0JfQ0KLQlyZXR1cm4gMTsNCi19DQotDQot
 DQogLyoNCiAgKiBDb252ZXJ0IGEgc3RyaW5nIG9mIGRpZ2l0cyB0byBhbiBpbnRlZ2VyLCBwcmlu
 dGluZyBhbiBlcnJvciBtZXNzYWdlIG9uDQogICogZmFpbHVyZS4NCkBAIC0xMjEsOSArMTA4LDQz
 IEBADQogaW50DQogaXNfbnVtYmVyKGNvbnN0IGNoYXIgKnApDQogew0KKwkvKiBJcyB0aGlzIHRo
 ZSBmaXJzdCBpbmRleD8gKi8NCisJaW50IGl0ZXIgPSAwOw0KKw0KKyNpZiBERUJVRw0KKyNkZWZp
 bmUgUFJJTlRfREVCVUcgZnByaW50ZihzdGRlcnIsICIlZDogJWNcbiIsIGl0ZXIsICpwKQ0KKyNl
 bHNlDQorI2RlZmluZSBQUklOVF9ERUJVRyAgDQorI2VuZGlmDQorDQogCWRvIHsNCi0JCWlmICgh
 IGlzX2RpZ2l0KCpwKSkNCisJCS8qDQorCQkgKiBBY2NvdW50IGZvciBzaWducyBpbiBmcm9udCBv
 ZiBudW1iZXJzLg0KKwkJICovDQorDQorCQkvKg0KKwkJICogWFhYOiBkb2VzIFBPU0lYIGJvdXJu
 ZSBzaGVsbCBhbGxvdyAnKycgcHJlZml4ZWQNCisJCSAqIG51bWJlcnM/DQorCQkgKi8NCisNCisJ
 CS8qDQorCQkgKiBUaGUgc3RyaW5nIGRlZmluZWQgYnkgKnAgaXNuJ3QgYSBudW1iZXIsIHVubGVz
 czoNCisJCSAqIAkxLiBJdCdzIGEgZGlnaXQuDQorCQkgKiAJMi4gVGhlIDAndGggaW5kZXggaXMg
 ZWl0aGVyIGEgKyBvciAtLg0KKwkJICovDQorCQlpZiAoIShpc19kaWdpdCgqcCkgfHwNCisJCSAg
 ICAgKGl0ZXIgPT0gMCAmJiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykpKQ0KKwkJKSB7DQorCQkJ
 UFJJTlRfREVCVUc7DQogCQkJcmV0dXJuIDA7DQorCQl9DQorDQorCQlQUklOVF9ERUJVRzsNCisN
 CisjdW5kZWYgUFJJTlRfREVCVUcNCisNCisJCWl0ZXIrKzsNCisNCiAJfSB3aGlsZSAoKisrcCAh
 PSAnXDAnKTsNCiAJcmV0dXJuIDE7DQogfQ0KSW5kZXg6IG15c3RyaW5nLmgNCj09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
 ClJDUyBmaWxlOiAvaG9tZS9uY3ZzL3NyYy9iaW4vc2gvbXlzdHJpbmcuaCx2DQpyZXRyaWV2aW5n
 IHJldmlzaW9uIDEuOA0KZGlmZiAtdSAtcjEuOCBteXN0cmluZy5oDQotLS0gbXlzdHJpbmcuaAk2
 IEFwciAyMDA0IDIwOjA2OjUxIC0wMDAwCTEuOA0KKysrIG15c3RyaW5nLmgJMjAgSnVuIDIwMDgg
 MDA6NTg6NDcgLTAwMDANCkBAIC0zNiw3ICszNiw2IEBADQogI2luY2x1ZGUgPHN0cmluZy5oPg0K
 IA0KIHZvaWQgc2NvcHluKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOw0KLWludCBwcmVmaXgo
 Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOw0KIGludCBudW1iZXIoY29uc3QgY2hhciAqKTsN
 CiBpbnQgaXNfbnVtYmVyKGNvbnN0IGNoYXIgKik7DQogDQo=
 ------=_Part_7301_29624223.1213923996732--

From: Jilles Tjoelker <jilles@stack.nl>
To: bug-followup@FreeBSD.org, gcooper@FreeBSD.org
Cc:  
Subject: Re: bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal
	number: -1", instead of exiting with a code of 255
Date: Sun, 26 Apr 2009 16:40:46 +0200

 Do people actually use 'exit -1' instead of the clearer 'exit 255'? '-1'
 is not an unsigned integer, so not a posix compliant parameter to the
 exit special builtin. Even then, sh still aborts a script with a nonzero
 exit code if exit is used wrongly like this.
 
 -- 
 Jilles Tjoelker

From: Garrett Cooper <yaneurabeya@gmail.com>
To: Jilles Tjoelker <jilles@stack.nl>
Cc: bug-followup@freebsd.org
Subject: Re: bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal 
	number: -1", instead of exiting with a code of 255
Date: Sun, 26 Apr 2009 18:46:43 -0700

 On Sun, Apr 26, 2009 at 7:40 AM, Jilles Tjoelker <jilles@stack.nl> wrote:
 > Do people actually use 'exit -1' instead of the clearer 'exit 255'? '-1'
 > is not an unsigned integer, so not a posix compliant parameter to the
 > exit special builtin. Even then, sh still aborts a script with a nonzero
 > exit code if exit is used wrongly like this.
 
 Some people do, but I've since then stopped doing this.
 
 The question I have is:
 - Is the value of the return code uint8_t?
 - Where in the documentation for sh(1) does it say that it can't be
 <0? Here are all of the relevant documentation items for exit codes I
 could find:
 
    Command Exit Status
      Each command has an exit status that can influence the behavior of other
      shell commands.  The paradigm is that a command exits with zero for nor-
      mal or success, and non-zero for failure, error, or a false indication.
      The man page for each command should indicate the various exit codes and
      what they mean.  Additionally, the built-in commands return exit codes,
      as does an executed shell function.
 
      If a command is terminated by a signal, its exit status is 128 plus the
      signal number.  Signal numbers are defined in the header file
      <sys/signal.h>.
 
 ----
 
      exit [exitstatus]
              Terminate the shell process.  If exitstatus is given it is used
              as the exit status of the shell; otherwise the exit status of the
              preceding command is used.
 
 ----
 
 Nowhere in the above documentation does it mention valid limits being
 in the set, [0, 128+SIGRTMAX] => [0, 254]. It's merely implied by the
 resources at one's disposal (the source, sys/signal.h, etc).
 
 Thanks,
 -Garrett

From: Garrett Cooper <yaneurabeya@gmail.com>
To: Garrett Cooper <yaneurabeya@gmail.com>
Cc: Jilles Tjoelker <jilles@stack.nl>, bug-followup@freebsd.org
Subject: Re: bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal 
	number: -1", instead of exiting with a code of 255
Date: Sun, 26 Apr 2009 18:49:38 -0700

 On Sun, Apr 26, 2009 at 6:46 PM, Garrett Cooper <yaneurabeya@gmail.com> wrote=
 :
 > On Sun, Apr 26, 2009 at 7:40 AM, Jilles Tjoelker <jilles@stack.nl> wrote:
 >> Do people actually use 'exit -1' instead of the clearer 'exit 255'? '-1'
 >> is not an unsigned integer, so not a posix compliant parameter to the
 >> exit special builtin. Even then, sh still aborts a script with a nonzero
 >> exit code if exit is used wrongly like this.
 >
 > Some people do, but I've since then stopped doing this.
 >
 > The question I have is:
 > - Is the value of the return code uint8_t?
 > - Where in the documentation for sh(1) does it say that it can't be
 > <0? Here are all of the relevant documentation items for exit codes I
 > could find:
 >
 > =A0 Command Exit Status
 > =A0 =A0 Each command has an exit status that can influence the behavior o=
 f other
 > =A0 =A0 shell commands. =A0The paradigm is that a command exits with zero=
  for nor-
 > =A0 =A0 mal or success, and non-zero for failure, error, or a false indic=
 ation.
 > =A0 =A0 The man page for each command should indicate the various exit co=
 des and
 > =A0 =A0 what they mean. =A0Additionally, the built-in commands return exi=
 t codes,
 > =A0 =A0 as does an executed shell function.
 >
 > =A0 =A0 If a command is terminated by a signal, its exit status is 128 pl=
 us the
 > =A0 =A0 signal number. =A0Signal numbers are defined in the header file
 > =A0 =A0 <sys/signal.h>.
 >
 > ----
 >
 > =A0 =A0 exit [exitstatus]
 > =A0 =A0 =A0 =A0 =A0 =A0 Terminate the shell process. =A0If exitstatus is =
 given it is used
 > =A0 =A0 =A0 =A0 =A0 =A0 as the exit status of the shell; otherwise the ex=
 it status of the
 > =A0 =A0 =A0 =A0 =A0 =A0 preceding command is used.
 >
 > ----
 >
 > Nowhere in the above documentation does it mention valid limits being
 > in the set, [0, 128+SIGRTMAX] =3D> [0, 254]. It's merely implied by the
 > resources at one's disposal (the source, sys/signal.h, etc).
 >
 > Thanks,
 > -Garrett
 
 Furthermore, exit permits signed integers, which is a different --
 much larger -- dataset of valid input values:
 
 EXIT(3)                FreeBSD Library Functions Manual                EXIT=
 (3)
 
 NAME
      exit, _Exit -- perform normal program termination
 
 LIBRARY
      Standard C Library (libc, -lc)
 
 SYNOPSIS
      #include <stdlib.h>
 
      void
      exit(int status);
 
      void
      _Exit(int status);
 
 Thanks,
 -Garrett

From: Jilles Tjoelker <jilles@stack.nl>
To: Garrett Cooper <yaneurabeya@gmail.com>
Cc: bug-followup@freebsd.org
Subject: Re: bin/124748: [patch] sh(1): sh -c 'exit -1' fails with "Illegal
	number: -1", instead of exiting with a code of 255
Date: Sun, 24 May 2009 21:14:57 +0200

 On Sun, Apr 26, 2009 at 06:46:43PM -0700, Garrett Cooper wrote:
 > On Sun, Apr 26, 2009 at 7:40 AM, Jilles Tjoelker <jilles@stack.nl> wrote:
 > > Do people actually use 'exit -1' instead of the clearer 'exit 255'? '-1'
 > > is not an unsigned integer, so not a posix compliant parameter to the
 > > exit special builtin. Even then, sh still aborts a script with a nonzero
 > > exit code if exit is used wrongly like this.
 
 > Some people do, but I've since then stopped doing this.
 
 > The question I have is:
 > - Is the value of the return code uint8_t?
 
 On the kernel level it is, see wait4(2) and exit(3).
 
 On the shell level this is not necessarily the case.
 
 FreeBSD's /bin/sh allows more bits to be 'return'ed from functions and
 to appear in $?; it seems unwise to take advantage of this.
 
 ksh93 uses 256+sig instead of 128+sig for commands terminated by
 signals, which makes it possible for the shell to replicate command exit
 status more precisely. For example:
   ksh93 -c 'sh -c "kill -9 \$\$"; exit'
 exits on signal 9, not with status 137. This does not work entirely
 correctly -- for example, replacing exit with exit $? makes it
 exit with status 9 -- but I think it can be done properly. On the other
 hand this may not be so nice with logged signals (SIGSEGV etc).
 
 > - Where in the documentation for sh(1) does it say that it can't be
 > <0? Here are all of the relevant documentation items for exit codes I
 > could find:
 
 >    Command Exit Status
 >      Each command has an exit status that can influence the behavior of other
 >      shell commands.  The paradigm is that a command exits with zero for nor-
 >      mal or success, and non-zero for failure, error, or a false indication.
 >      The man page for each command should indicate the various exit codes and
 >      what they mean.  Additionally, the built-in commands return exit codes,
 >      as does an executed shell function.
 
 >      If a command is terminated by a signal, its exit status is 128 plus the
 >      signal number.  Signal numbers are defined in the header file
 >      <sys/signal.h>.
 
 > ----
 
 >      exit [exitstatus]
 >              Terminate the shell process.  If exitstatus is given it is used
 >              as the exit status of the shell; otherwise the exit status of the
 >              preceding command is used.
 
 > ----
 
 > Nowhere in the above documentation does it mention valid limits being
 > in the set, [0, 128+SIGRTMAX] => [0, 254]. It's merely implied by the
 > resources at one's disposal (the source, sys/signal.h, etc).
 
 I suppose that could be added (0..255).
 
 -- 
 Jilles Tjoelker

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/124748: commit references a PR
Date: Sun,  7 Jun 2009 15:05:00 +0000 (UTC)

 Author: jilles
 Date: Sun Jun  7 15:04:43 2009
 New Revision: 193636
 URL: http://svn.freebsd.org/changeset/base/193636
 
 Log:
   Mention the range for the exit status for the exit special builtin.
   
   The exit status may exceed 255 in some cases (return); even though it seems
   unwise to rely on this, it is also unwise to assume that $? is always
   between 0 and 255.
   
   This resolves bin/124748 by documenting that 'exit -1' is not valid.
   
   PR:		bin/124748
   Approved by:	ed (mentor)
 
 Modified:
   head/bin/sh/sh.1
 
 Modified: head/bin/sh/sh.1
 ==============================================================================
 --- head/bin/sh/sh.1	Sun Jun  7 13:26:57 2009	(r193635)
 +++ head/bin/sh/sh.1	Sun Jun  7 15:04:43 2009	(r193636)
 @@ -1682,6 +1682,7 @@ If
  is given
  it is used as the exit status of the shell;
  otherwise the exit status of the preceding command is used.
 +The exit status should be an integer between 0 and 255.
  .It Ic export Ar name ...
  .It Ic export Op Fl p
  The specified names are exported so that they will
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->closed 
State-Changed-By: jilles 
State-Changed-When: Thu Sep 10 19:42:52 UTC 2009 
State-Changed-Why:  
Fixed by documenting restriction. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=124748 
>Unformatted:
