Subject: Re: CVS commit: basesrc/bin/sh
To: enami tsugutomo <enami@sm.sony.co.jp>
From: Christos Zoulas <christos@zoulas.com>
List: source-changes
Date: 02/13/2002 12:01:29
On Feb 13, 10:38am, enami@sm.sony.co.jp (enami tsugutomo) wrote:
-- Subject: Re: CVS commit: basesrc/bin/sh
| Christos Zoulas <christos@netbsd.org> writes:
|
| > cvs rdiff -r1.50 -r1.51 basesrc/bin/sh/parser.c
|
| > Index: basesrc/bin/sh/parser.c
| > diff -u basesrc/bin/sh/parser.c:1.50 basesrc/bin/sh/parser.c:1.51
| > --- basesrc/bin/sh/parser.c:1.50 Tue Feb 12 08:39:10 2002
| > +++ basesrc/bin/sh/parser.c Tue Feb 12 22:32:35 2002
| > @@ -877,6 +879,21 @@
| > #define PARSEBACKQNEW() {oldstyle = 0; goto parsebackq; parsebackq_newreturn:;}
| > #define PARSEARITH() {goto parsearith; parsearith_return:;}
| >
| > +#define ISDBLQUOTE() ((varnest < 32) ? (dblquote & (1 << varnest)) : \
| > + (dblquotep[varnest / 32] & (1 << (varnest % 32))))
|
|
| >From this definition, dblquotep[0] isn't used even if maxnest is
| greater than 32, but ...
|
| > varnest++;
| > + if (varnest >= maxnest) {
| > + maxnest += 32;
| > + dblquotep = ckrealloc(dblquotep, maxnest / 8);
| > + if (maxnest == 64)
| > + *dblquotep = dblquote;
|
| ...here, dblquotep[0] is initialized with dblquote. It looks
| inconsistient.
Yes, but I wanted to keep the dblquotep array correct no matter if it is used
or not. It is a good programming practice to keep data consistent.
| > @@ -1082,6 +1115,8 @@
| > backquotelist = bqlist;
| > grabstackblock(len);
| > wordtext = out;
| > + if (dblquotep != NULL)
| > + ckfree(dblquotep);
| > return lasttoken = TWORD;
| > /* end of readtoken routine */
| >
|
| There are more return statements in this function. Is it known to be
| safe without free'ing dblquotep there (it looks like one of them isn't
| compiled tho)?
No, we have to free it everywhere. The problem is actually worse: You can
leave the function without free-ing if the expansion is interrupted by a
signal. On the other hand, it is pretty uncommon to have > 32 nested double
quotes, so it is not a big deal. But if you are certain that the function
can return at other points, we need to add free's there too.
christos