summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/make/var.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index 32da4e8..3221bdd 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -1350,15 +1350,16 @@ Var_Parse(char *str, GNode *ctxt, Boolean err, int *lengthPtr, Boolean *freePtr)
}
/*
- * 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.
+ * Global substitution of the empty string causes an
+ * infinite number of matches, unless anchored by '^'
+ * (start of string) or '$' (end of string). Catch the
+ * infinite substitution here.
+ * Note that flags can only contain the 3 bits we're
+ * interested in so we don't have to mask unrelated
+ * bits. We can test for equality.
*/
- if (pattern.leftLen == 0)
- pattern.flags &= ~VAR_SUB_GLOBAL;
+ if (!pattern.leftLen && pattern.flags == VAR_SUB_GLOBAL)
+ Fatal("Global substitution of the empty string");
termc = *cp;
newStr = VarModify(str, VarSubstitute,
OpenPOWER on IntegriCloud