summaryrefslogtreecommitdiffstats
path: root/usr.bin/make/var.c
diff options
context:
space:
mode:
authorharti <harti@FreeBSD.org>2005-03-30 15:14:22 +0000
committerharti <harti@FreeBSD.org>2005-03-30 15:14:22 +0000
commitcf97e03db75b91cbf2215cb833a5d278f152fd6e (patch)
tree9e651fde00117c1906c524287584e79986900788 /usr.bin/make/var.c
parenteedd5656c1fa34fd0801cedb9125b3b2ba844bc1 (diff)
downloadFreeBSD-src-cf97e03db75b91cbf2215cb833a5d278f152fd6e.zip
FreeBSD-src-cf97e03db75b91cbf2215cb833a5d278f152fd6e.tar.gz
Fix a bug introduced in a previous commit: ParseModifier() consumes
characters so it is not safe to move around code from before it to after it. This should fix problems with building the documentation. Patch: 7.170 Submitted by: Max Okumoto <okumoto@ucsd.edu>
Diffstat (limited to 'usr.bin/make/var.c')
-rw-r--r--usr.bin/make/var.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index 6bfdcee..d47971d 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -1304,8 +1304,20 @@ ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
}
if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) {
- size_t consumed = vp->ptr - vp->input + 1;
+ size_t consumed;
+ /*
+ * Still need to get to the end of the variable
+ * specification, so kludge up a Var structure for the
+ * modifications
+ */
+ v = VarCreate(vname, NULL, VAR_JUNK);
+ value = ParseModifier(vp, startc, v, freeResult);
+ if (*freeResult) {
+ free(value);
+ }
+ VarDestroy(v, TRUE);
+ consumed = vp->ptr - vp->input + 1;
/*
* If substituting a local variable in a non-local context,
* assume it's for dynamic source stuff. We have to handle
@@ -1341,6 +1353,9 @@ ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
return (value);
}
}
+
+ *freeResult = FALSE;
+ return (vp->err ? var_Error : varNoError);
} else {
/*
* Check for D and F forms of local variables since we're in
@@ -1360,22 +1375,22 @@ ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
return (value);
}
}
- }
- /*
- * Still need to get to the end of the variable
- * specification, so kludge up a Var structure for the
- * modifications
- */
- v = VarCreate(vname, NULL, VAR_JUNK);
- value = ParseModifier(vp, startc, v, freeResult);
- if (*freeResult) {
- free(value);
- }
- VarDestroy(v, TRUE);
+ /*
+ * Still need to get to the end of the variable
+ * specification, so kludge up a Var structure for the
+ * modifications
+ */
+ v = VarCreate(vname, NULL, VAR_JUNK);
+ value = ParseModifier(vp, startc, v, freeResult);
+ if (*freeResult) {
+ free(value);
+ }
+ VarDestroy(v, TRUE);
- *freeResult = FALSE;
- return (vp->err ? var_Error : varNoError);
+ *freeResult = FALSE;
+ return (vp->err ? var_Error : varNoError);
+ }
}
static char *
OpenPOWER on IntegriCloud