On Thu, Oct 31, 2002 at 06:21:25AM -0800, Juli Mallett wrote: > * De: Ruslan Ermilov <[EMAIL PROTECTED]> [ Data: 2002-10-31 ] > [ Subjecte: Re: changes to make(1) ] > > Interesting. It seems to me we really need a 'CondIsExpressionTerminator' > or something. ')' should only be a terminator if we are inside a '('. are > both of those cases in '(' code? If so then everything else is bogus, so > I'd bet not :( > ')' should either be escaped or quoted to be recognized properly here.
With or without my patch (make -r -dc): STR= foo .if ${STR} == foo) ==> lhs = "foo", rhs = "foo", op = == (malformed conditional) .if ${STR} == foo\) ==> lhs = "foo", rhs = "foo)", op = == .if ${STR} == "foo)" ==> lhs = "foo", rhs = "foo)", op = == You'll get the similar results with the NUM=1 and .if ${NUM} == 1 except here: .if ${NUM} == 1) old version will ==> lhs = "1", rhs = "1", op = == new version will ==> left = 1.000000, right = 1.000000, op = == (both will fail with malformed conditional) If we go further and back out the change in rev. 1.9, we can even make the following code work (no surrounding spaces for &&): NUM= 1 num: .if (${NUM}==1&&${NUM}==1) @echo OK. .endif But this will cost us the following: .if ${NUM} > 0z @echo OK. .endif make(1) won't now complain about "z". A small improvement gives us: %%% Index: cond.c =================================================================== RCS file: /home/ncvs/src/usr.bin/make/cond.c,v retrieving revision 1.25 diff -u -p -u -r1.25 cond.c --- cond.c 23 Oct 2002 23:16:42 -0000 1.25 +++ cond.c 31 Oct 2002 15:26:16 -0000 @@ -688,16 +688,13 @@ do_string_compare: } } else { char *c = CondCvtArg(rhs, &right); - if (*c != '\0' && !isspace((unsigned char) *c)) + if (c == rhs) goto do_string_compare; if (rhs == condExpr) { /* * Skip over the right-hand side */ - while(!isspace((unsigned char) *condExpr) && - (*condExpr != '\0')) { - condExpr++; - } + condExpr = c; } } %%% > > %%% > > Index: cond.c > > =================================================================== > > RCS file: /home/ncvs/src/usr.bin/make/cond.c,v > > retrieving revision 1.25 > > diff -u -p -r1.25 cond.c > > --- cond.c 23 Oct 2002 23:16:42 -0000 1.25 > > +++ cond.c 31 Oct 2002 13:10:13 -0000 > > @@ -688,14 +688,15 @@ do_string_compare: > > } > > } else { > > char *c = CondCvtArg(rhs, &right); > > - if (*c != '\0' && !isspace((unsigned char) *c)) > > + if (*c != '\0' && *c != ')' && > > + !isspace((unsigned char) *c)) > > goto do_string_compare; > > if (rhs == condExpr) { > > /* > > * Skip over the right-hand side > > */ > > while(!isspace((unsigned char) *condExpr) && > > - (*condExpr != '\0')) { > > + *condExpr != ')' && *condExpr != '\0') { > > condExpr++; > > } > > } > > %%% > > > > ports/devel/pmake is also vulnerable to this (even the latest beta), > > and unless I'm dreadfully mistaken, OpenBSD's make(1) too. Cheers, -- Ruslan Ermilov Sysadmin and DBA, [EMAIL PROTECTED] Sunbay Software AG, [EMAIL PROTECTED] FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age
msg45792/pgp00000.pgp
Description: PGP signature