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

Attachment: msg45792/pgp00000.pgp
Description: PGP signature

Reply via email to