diff options
author | harti <harti@FreeBSD.org> | 2005-02-28 15:01:37 +0000 |
---|---|---|
committer | harti <harti@FreeBSD.org> | 2005-02-28 15:01:37 +0000 |
commit | b62f7499ab8c630062978fcbf970b1a65ad571f7 (patch) | |
tree | e679ef73ec6e8e37a7ccd9f2f5ef2a115e515482 /usr.bin | |
parent | 43bead57c49b90533d72791cdb692a1b18af6387 (diff) | |
download | FreeBSD-src-b62f7499ab8c630062978fcbf970b1a65ad571f7.zip FreeBSD-src-b62f7499ab8c630062978fcbf970b1a65ad571f7.tar.gz |
Don't modify the input string in VarParseLong(). It is not
necessary to NUL-terminated it, because we know the lengths
from the pointers.
Patch: 7.80
Submitted by: Max Okumoto <okumoto@ucsd.edu>
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/make/var.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index e3ff098..bd9ade8 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -956,7 +956,6 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, } haveModifier = (*tstr == ':'); - *tstr = '\0'; /* modify input string */ vname = Buf_GetAll(buf, (size_t *)NULL); /* REPLACE str */ vlen = strlen(vname); @@ -1001,7 +1000,6 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, */ *freePtr = TRUE; *lengthPtr = tstr - input + 1; - *tstr = endc; Buf_Destroy(buf, TRUE); return (val); } @@ -1060,9 +1058,9 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, * No modifiers -- have specification length so we can return * now. */ + size_t rlen = tstr - input + 1; if (dynamic) { char *result; - size_t rlen = tstr - input + 1; result = emalloc(rlen + 1); strncpy(result, input, rlen); @@ -1070,14 +1068,12 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, *freePtr = TRUE; *lengthPtr = rlen; - *tstr = endc; Buf_Destroy(buf, TRUE); return (result); } else { *freePtr = FALSE; - *lengthPtr = tstr - input + 1; - *tstr = endc; + *lengthPtr = rlen; Buf_Destroy(buf, TRUE); return (err ? var_Error : varNoError); @@ -1086,7 +1082,7 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, } else { dynamic = FALSE; } - *freePtr = FALSE; + Buf_Destroy(buf, TRUE); rw_str = VarExpand(v, ctxt, err); @@ -1117,10 +1113,8 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, */ if (haveModifier) { char *cp; - /* - * Skip initial colon while putting it back. - */ - *tstr++ = ':'; + + tstr++; while (*tstr != endc) { char *newStr; /* New value to return */ char termc; /* Character which terminated scan */ @@ -1639,11 +1633,8 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr, } tstr = cp; } - *lengthPtr = tstr - input + 1; - } else { - *lengthPtr = tstr - input + 1; - *tstr = endc; } + *lengthPtr = tstr - input + 1; if (v->flags & VAR_FROM_ENV) { if (rw_str == (char *)Buf_GetAll(v->val, (size_t *)NULL)) { |