summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2003-01-13 23:53:46 +0000
committermarcel <marcel@FreeBSD.org>2003-01-13 23:53:46 +0000
commitf9f65ee8ce3c53596ac4cad3b33efeb708ebec9b (patch)
treeb2391a3432f6514ca22612f82bf04eb6ff4372a8 /usr.bin
parentc1ba1fb1205392b8f4cb23a7451e47f0d7275e3d (diff)
downloadFreeBSD-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')
-rw-r--r--usr.bin/make/var.c11
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);
OpenPOWER on IntegriCloud