Date: Thu, 31 Oct 2002 17:43:19 +0200 From: Ruslan Ermilov <ru@FreeBSD.ORG> To: Juli Mallett <jmallett@FreeBSD.ORG> Cc: Alan Eldridge <alane@FreeBSD.ORG>, Warner Losh <imp@FreeBSD.ORG>, current@FreeBSD.ORG Subject: Re: changes to make(1) Message-ID: <20021031154319.GD55353@sunbay.com> In-Reply-To: <20021031062125.A54740@FreeBSD.org> References: <20021030152046.GA93680@sunbay.com> <20021030161329.GC72564@wwweasel.geeksrus.net> <20021030204920.L38444@freebsdmall.com> <20021031060320.GB87766@wwweasel.geeksrus.net> <20021031060820.GA19819@dragon.nuxi.com> <20021031061246.GA45936@wwweasel.geeksrus.net> <20021031092026.GA23436@sunbay.com> <20021031093732.GA531@wwweasel.geeksrus.net> <20021031141315.GB55353@sunbay.com> <20021031062125.A54740@FreeBSD.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
On Thu, Oct 31, 2002 at 06:21:25AM -0800, Juli Mallett wrote:
> * De: Ruslan Ermilov <ru@FreeBSD.org> [ 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,
ru@sunbay.com Sunbay Software AG,
ru@FreeBSD.org FreeBSD committer,
+380.652.512.251 Simferopol, Ukraine
http://www.FreeBSD.org The Power To Serve
http://www.oracle.com Enabling The Information Age
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (FreeBSD)
iD8DBQE9wU+XUkv4P6juNwoRAr9DAKCA4F8KfmyNDW5hE5FAsa7l98TL7gCeIFEr
rMSUtuezddrXQKy9H1U1TKA=
=Ms5n
-----END PGP SIGNATURE-----
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021031154319.GD55353>
