diff options
author | marcel <marcel@FreeBSD.org> | 2003-01-13 23:53:46 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2003-01-13 23:53:46 +0000 |
commit | f9f65ee8ce3c53596ac4cad3b33efeb708ebec9b (patch) | |
tree | b2391a3432f6514ca22612f82bf04eb6ff4372a8 /usr.bin/make | |
parent | c1ba1fb1205392b8f4cb23a7451e47f0d7275e3d (diff) | |
download | FreeBSD-src-f9f65ee8ce3c53596ac4cad3b33efeb708ebec9b.zip FreeBSD-src-f9f65ee8ce3c53596ac4cad3b33efeb708ebec9b.tar.gz |
Prevent infinite substitution of the empty string by forcing non-
global substitution. In general it's a makefile bug to globally
substitute the empty string, but it's a bug in make(1) if a bug
in the makefile yields an infinite running time of make(1).
Not objected to by: arch@
Diffstat (limited to 'usr.bin/make')
-rw-r--r-- | usr.bin/make/var.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index b5b2b02..32da4e8 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -1349,6 +1349,17 @@ Var_Parse(char *str, GNode *ctxt, Boolean err, int *lengthPtr, Boolean *freePtr) cp++; } + /* + * Replacing the empty string for something else when + * done globally causes an infinite loop. The only + * meaningful substitution of the empty string would + * be those anchored by '^' or '$'. Thus, we can + * safely turn the substitution into a non-global one + * if the LHS is the empty string. + */ + if (pattern.leftLen == 0) + pattern.flags &= ~VAR_SUB_GLOBAL; + termc = *cp; newStr = VarModify(str, VarSubstitute, (void *)&pattern); |