tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: make: avoid segfault on parse error



In article <20081021182253.E7A4E668B%void.crufty.net@localhost>,
Simon J. Gerraty <sjg%crufty.net@localhost> wrote:
>While trying to trick make into handling something like:
>
>VAR += ${${X:U0} > 0:?Use $X:}
>
>I came accross the need for something like this.
>
>Index: parse.c
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/parse.c,v
>retrieving revision 1.147
>diff -u -p -r1.147 parse.c
>--- parse.c    6 Oct 2008 22:09:21 -0000       1.147
>+++ parse.c    21 Oct 2008 18:19:01 -0000
>@@ -392,7 +392,7 @@ ParseVErrorInternal(FILE *f, const char 
> 
>       (void)fprintf(f, "%s: \"", progname);
> 
>-      if (*cfname != '/' && strcmp(cfname, "(stdin)") != 0) {
>+      if (*cfname != '/' && *cfname != '(') {
>               char *cp;
>               const char *dir;
> 
>@@ -471,6 +471,15 @@ Parse_Error(int type, const char *fmt, .
>       va_list ap;
> 
>       va_start(ap, fmt);
>+      if (curFile == (IFile *)NIL) {
>+              /* avoid segfault */
>+              static IFile intFile = {
>+                      .fname = "(unknown)",
>+                      .lineno = 0,
>+                      .fd = -1,
>+              };
>+              curFile = &intFile;
>+      }
>       ParseVErrorInternal(stderr, curFile->fname, curFile->lineno,
>                   type, fmt, ap);
>       va_end(ap);
>Index: unit-tests/cond1
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/unit-tests/cond1,v
>retrieving revision 1.3
>diff -u -p -r1.3 cond1
>--- unit-tests/cond1   13 Apr 2004 16:06:23 -0000      1.3
>+++ unit-tests/cond1   21 Oct 2008 18:19:01 -0000
>@@ -100,3 +100,4 @@ all:
>       @echo "A='$A' B='$B' C='$C' o='$o,${o2}'"
>       @echo "Passed:${.newline} ${Ok:S/,/${.newline}/}"
>       @echo "${NUMBERS:@n@$n is ${("${PRIMES:M$n}" == ""):?not:} 
> prime${.newline}@}"
>+      @echo "${"${NoSuch:U0}" > 0:?OK:No}"
>Index: unit-tests/test.exp
>===================================================================
>RCS file: /cvsroot/src/usr.bin/make/unit-tests/test.exp,v
>retrieving revision 1.25
>diff -u -p -r1.25 test.exp
>--- unit-tests/test.exp        15 May 2008 21:05:55 -0000      1.25
>+++ unit-tests/test.exp        21 Oct 2008 18:19:01 -0000
>@@ -20,6 +20,9 @@ Passed:
> 4 is not prime
> 5 is  prime
> 
>+make: "(unknown)" line 0: warning: String comparison operator should be
>either == or !=
>+make: Bad conditional expression `"0" > 0' in "0" > 0?OK:No
>+

So this worked in 4.99.1, and it broke somehow now... I think we should
look why we are reaching EOF twice first.

christos



Home | Main Index | Thread Index | Old Index