Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 May 1996 12:28:32 -0500 (CDT)
From:      fredriks@mcs.com
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/1248: shell having problem parsing arguments
Message-ID:  <199605241728.MAA12700@fredriks.pr.mcs.net>
Resent-Message-ID: <199605250350.UAA03865@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         1248
>Category:       bin
>Synopsis:       /bin/sh has trouble with arguments past 9(ie. ${10})
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri May 24 20:50:02 PDT 1996
>Last-Modified:
>Originator:     Lars Fredriksen
>Organization:
Flaaklypa Hackers
>Release:        FreeBSD 2.2-CURRENT i386
>Environment:
		FreeBSD 2.2-CURRENT as of 5/23/96 (sup and compile)


>Description:
	/bin/sh has a couple of bugs when dealing with arguments past
	argument #9. First off you get a syntax error when it tries
	to parse ${11}, enclosed is fix for the parser. The second 
	problem is that the setting and retrieving of variables did
	not handle anything past 9 arguments. The fix is in expand.c
	and is included below. Please test and review these. The
	fixes seem to work on the stuff I have tested, but I do not
	claim to have done a complete regression test on the sh.

	I do have commit priviledges so I can do the commits, but
	I need someone to review this. The same goes for kern/1245!

>How-To-Repeat:
>Fix:

Index: parser.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/parser.c,v
retrieving revision 1.11
diff -r1.11 parser.c
1111,1112c1111,1120
< 			USTPUTC(c, out);
< 			c = pgetc();
---
> 			
> 			if (is_digit(c)) {
> 				do {
> 					STPUTC(c, out);
> 					c = pgetc();
> 				} while( is_digit(c));
> 			} else {
> 				USTPUTC(c, out);
> 				c = pgetc();
> 			}


Index: expand.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/expand.c,v
retrieving revision 1.4
diff -r1.4 expand.c
93,94c93,94
< STATIC int varisset(int);
< STATIC void varvalue(int, int, int);
---
> STATIC int varisset(char *);
> STATIC void varvalue(char *, int, int);
456c456
< 		set = varisset(*var);
---
> 		set = varisset(var);
470c470
< 			varvalue(*var, varflags & VSQUOTE, flag & EXP_FULL);
---
> 			varvalue(var, varflags & VSQUOTE, flag & EXP_FULL);
542c542
< 	char name;
---
> 	char *name;
543a544,545
> 	char *t;
> 	int numvar;
546c548
< 	if (name == '!') {
---
> 	if (*name == '!') {
549c551
< 	} else if (name == '@' || name == '*') {
---
> 	} else if (*name == '@' || *name == '*') {
552,557c554,568
< 	} else if ((unsigned)(name -= '1') <= '9' - '1') {
< 		ap = shellparam.p;
< 		do {
< 			if (*ap++ == NULL)
< 				return 0;
< 		} while (--name >= 0);
---
> 	} else {
> 		t = name;
> 		while (is_digit(*t++)) {
> 			;
> 		}
> 
> 		if ( *--t == '=' ) { 
> 			*t = '\0';
> 			numvar = atoi(name);
> 			ap = shellparam.p;
> 			do {
> 				if (*ap++ == NULL)
> 					return 0;
> 			} while (--numvar > 0);
> 		} 
570c581
< 	char name;
---
> 	char *name;
572a584
> 	int numvar;
574a587
> 	char *t;
596c609
< 	switch (name) {
---
> 	switch (*name) {
643,644c656,663
< 		if ((unsigned)(name -= '1') <= '9' - '1') {
< 			p = shellparam.p[name];
---
> 
> 		t = name;
> 		while (is_digit(*t++)) {
> 		}
> 
> 		if ( *t == '\0' ) { 
> 			numvar = atoi(name);
> 			p = shellparam.p[numvar-1];
>Audit-Trail:
>Unformatted:
>Repeat-By:
	JUNK="1 2 3 4 5 6 7 8 9 10 11 12"
	set $JUNK
	echo ${11}




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199605241728.MAA12700>