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