Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead of setting a boolean, set the pointer to be freed. Plug some more memory leaks found by inspection.
This commit is contained in:
parent
3d342ea626
commit
e052a053e4
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: arch.c,v 1.48 2005/08/08 16:42:54 christos Exp $ */
|
||||
/* $NetBSD: arch.c,v 1.49 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: arch.c,v 1.48 2005/08/08 16:42:54 christos Exp $";
|
||||
static char rcsid[] = "$NetBSD: arch.c,v 1.49 2006/03/31 21:58:08 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)arch.c 8.2 (Berkeley) 1/2/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: arch.c,v 1.48 2005/08/08 16:42:54 christos Exp $");
|
||||
__RCSID("$NetBSD: arch.c,v 1.49 2006/03/31 21:58:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -258,19 +258,18 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
* so we can safely advance beyond it...
|
||||
*/
|
||||
int length;
|
||||
Boolean freeIt;
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result=Var_Parse(cp, ctxt, TRUE, &length, &freeIt);
|
||||
result = Var_Parse(cp, ctxt, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
if (result == var_Error) {
|
||||
return(FAILURE);
|
||||
} else {
|
||||
subLibName = TRUE;
|
||||
}
|
||||
|
||||
if (freeIt) {
|
||||
free(result);
|
||||
}
|
||||
cp += length-1;
|
||||
}
|
||||
}
|
||||
@ -300,19 +299,18 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
* so we can safely advance beyond it...
|
||||
*/
|
||||
int length;
|
||||
Boolean freeIt;
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result=Var_Parse(cp, ctxt, TRUE, &length, &freeIt);
|
||||
result = Var_Parse(cp, ctxt, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
if (result == var_Error) {
|
||||
return(FAILURE);
|
||||
} else {
|
||||
doSubst = TRUE;
|
||||
}
|
||||
|
||||
if (freeIt) {
|
||||
free(result);
|
||||
}
|
||||
cp += length;
|
||||
} else {
|
||||
cp++;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cond.c,v 1.29 2005/08/08 16:42:54 christos Exp $ */
|
||||
/* $NetBSD: cond.c,v 1.30 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -70,14 +70,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: cond.c,v 1.29 2005/08/08 16:42:54 christos Exp $";
|
||||
static char rcsid[] = "$NetBSD: cond.c,v 1.30 2006/03/31 21:58:08 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)cond.c 8.2 (Berkeley) 1/2/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: cond.c,v 1.29 2005/08/08 16:42:54 christos Exp $");
|
||||
__RCSID("$NetBSD: cond.c,v 1.30 2006/03/31 21:58:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -251,7 +251,7 @@ CondGetArg(char **linePtr, char **argPtr, const char *func, Boolean parens)
|
||||
* than hitting the user with a warning message every time s/he uses
|
||||
* the word 'make' or 'defined' at the beginning of a symbol...
|
||||
*/
|
||||
*argPtr = cp;
|
||||
*argPtr = NULL;
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -275,14 +275,12 @@ CondGetArg(char **linePtr, char **argPtr, const char *func, Boolean parens)
|
||||
*/
|
||||
char *cp2;
|
||||
int len;
|
||||
Boolean doFree;
|
||||
|
||||
cp2 = Var_Parse(cp, VAR_CMD, TRUE, &len, &doFree);
|
||||
void *freeIt;
|
||||
|
||||
cp2 = Var_Parse(cp, VAR_CMD, TRUE, &len, &freeIt);
|
||||
Buf_AddBytes(buf, strlen(cp2), (Byte *)cp2);
|
||||
if (doFree) {
|
||||
free(cp2);
|
||||
}
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
cp += len;
|
||||
} else {
|
||||
Buf_AddByte(buf, (Byte)*cp);
|
||||
@ -540,7 +538,7 @@ CondCvtArg(char *str, double *value)
|
||||
* string. This is called for the lhs and rhs of string compares.
|
||||
*
|
||||
* Results:
|
||||
* Sets doFree if needed,
|
||||
* Sets freeIt if needed,
|
||||
* Sets quoted if string was quoted,
|
||||
* Returns NULL on error,
|
||||
* else returns string - absent any quotes.
|
||||
@ -551,8 +549,9 @@ CondCvtArg(char *str, double *value)
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
/* coverity:[+alloc : arg-*2] */
|
||||
static char *
|
||||
CondGetString(Boolean doEval, Boolean *quoted, Boolean *doFree)
|
||||
CondGetString(Boolean doEval, Boolean *quoted, void **freeIt)
|
||||
{
|
||||
Buffer buf;
|
||||
char *cp;
|
||||
@ -563,6 +562,7 @@ CondGetString(Boolean doEval, Boolean *quoted, Boolean *doFree)
|
||||
|
||||
buf = Buf_Init(0);
|
||||
str = NULL;
|
||||
*freeIt = NULL;
|
||||
*quoted = qt = *condExpr == '"' ? 1 : 0;
|
||||
if (qt)
|
||||
condExpr++;
|
||||
@ -596,8 +596,12 @@ CondGetString(Boolean doEval, Boolean *quoted, Boolean *doFree)
|
||||
case '$':
|
||||
/* if we are in quotes, then an undefined variable is ok */
|
||||
str = Var_Parse(condExpr, VAR_CMD, (qt ? 0 : doEval),
|
||||
&len, doFree);
|
||||
&len, freeIt);
|
||||
if (str == var_Error) {
|
||||
if (*freeIt) {
|
||||
free(*freeIt);
|
||||
*freeIt = NULL;
|
||||
}
|
||||
/*
|
||||
* Even if !doEval, we still report syntax errors, which
|
||||
* is what getting var_Error back with !doEval means.
|
||||
@ -623,9 +627,10 @@ CondGetString(Boolean doEval, Boolean *quoted, Boolean *doFree)
|
||||
for (cp = str; *cp; cp++) {
|
||||
Buf_AddByte(buf, (Byte)*cp);
|
||||
}
|
||||
if (*doFree)
|
||||
free(str);
|
||||
*doFree = FALSE;
|
||||
if (*freeIt) {
|
||||
free(*freeIt);
|
||||
*freeIt = NULL;
|
||||
}
|
||||
str = NULL; /* not finished yet */
|
||||
condExpr--; /* don't skip over next char */
|
||||
break;
|
||||
@ -637,7 +642,7 @@ CondGetString(Boolean doEval, Boolean *quoted, Boolean *doFree)
|
||||
got_str:
|
||||
Buf_AddByte(buf, (Byte)'\0');
|
||||
str = (char *)Buf_GetAll(buf, NULL);
|
||||
*doFree = TRUE;
|
||||
*freeIt = str;
|
||||
cleanup:
|
||||
Buf_Destroy(buf, FALSE);
|
||||
return str;
|
||||
@ -702,8 +707,8 @@ CondToken(Boolean doEval)
|
||||
char *lhs;
|
||||
char *rhs;
|
||||
char *op;
|
||||
Boolean lhsFree;
|
||||
Boolean rhsFree;
|
||||
void *lhsFree;
|
||||
void *rhsFree;
|
||||
Boolean lhsQuoted;
|
||||
Boolean rhsQuoted;
|
||||
|
||||
@ -717,8 +722,11 @@ CondToken(Boolean doEval)
|
||||
*/
|
||||
t = Err;
|
||||
lhs = CondGetString(doEval, &lhsQuoted, &lhsFree);
|
||||
if (!lhs)
|
||||
if (!lhs) {
|
||||
if (lhsFree)
|
||||
free(lhsFree);
|
||||
return Err;
|
||||
}
|
||||
/*
|
||||
* Skip whitespace to get to the operator
|
||||
*/
|
||||
@ -760,8 +768,13 @@ CondToken(Boolean doEval)
|
||||
goto error;
|
||||
}
|
||||
rhs = CondGetString(doEval, &rhsQuoted, &rhsFree);
|
||||
if (!rhs)
|
||||
if (!rhs) {
|
||||
if (lhsFree)
|
||||
free(lhsFree);
|
||||
if (rhsFree)
|
||||
free(rhsFree);
|
||||
return Err;
|
||||
}
|
||||
do_compare:
|
||||
if (rhsQuoted || lhsQuoted) {
|
||||
do_string_compare:
|
||||
@ -837,16 +850,16 @@ do_string_compare:
|
||||
}
|
||||
error:
|
||||
if (lhsFree)
|
||||
free(lhs);
|
||||
free(lhsFree);
|
||||
if (rhsFree)
|
||||
free(rhs);
|
||||
free(rhsFree);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
Boolean (*evalProc)(int, char *);
|
||||
Boolean invert = FALSE;
|
||||
char *arg;
|
||||
int arglen;
|
||||
char *arg = NULL;
|
||||
int arglen = 0;
|
||||
|
||||
if (istoken(condExpr, "defined", 7)) {
|
||||
/*
|
||||
@ -893,7 +906,7 @@ error:
|
||||
* True if the resulting string is empty.
|
||||
*/
|
||||
int length;
|
||||
Boolean doFree;
|
||||
void *freeIt;
|
||||
char *val;
|
||||
|
||||
condExpr += 5;
|
||||
@ -905,7 +918,7 @@ error:
|
||||
|
||||
if (condExpr[arglen] != '\0') {
|
||||
val = Var_Parse(&condExpr[arglen - 1], VAR_CMD,
|
||||
FALSE, &length, &doFree);
|
||||
FALSE, &length, &freeIt);
|
||||
if (val == var_Error) {
|
||||
t = Err;
|
||||
} else {
|
||||
@ -918,8 +931,8 @@ error:
|
||||
continue;
|
||||
t = (*p == '\0') ? True : False;
|
||||
}
|
||||
if (doFree) {
|
||||
free(val);
|
||||
if (freeIt) {
|
||||
free(freeIt);
|
||||
}
|
||||
/*
|
||||
* Advance condExpr to beyond the closing ). Note that
|
||||
@ -976,10 +989,12 @@ error:
|
||||
* Evaluate the argument using the set function. If invert
|
||||
* is TRUE, we invert the sense of the function.
|
||||
*/
|
||||
t = (!doEval || (* evalProc) (arglen, arg) ?
|
||||
void *ap = strdup(arg);
|
||||
if (arg)
|
||||
free(arg);
|
||||
t = (!doEval || (* evalProc) (arglen, ap) ?
|
||||
(invert ? False : True) :
|
||||
(invert ? True : False));
|
||||
free(arg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nonints.h,v 1.35 2006/02/11 18:37:36 dsl Exp $ */
|
||||
/* $NetBSD: nonints.h,v 1.36 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -184,7 +184,7 @@ void Var_Set(const char *, const char *, GNode *, int);
|
||||
void Var_Append(const char *, const char *, GNode *);
|
||||
Boolean Var_Exists(const char *, GNode *);
|
||||
char *Var_Value(const char *, GNode *, char **);
|
||||
char *Var_Parse(const char *, GNode *, Boolean, int *, Boolean *);
|
||||
char *Var_Parse(const char *, GNode *, Boolean, int *, void **);
|
||||
char *Var_Subst(const char *, const char *, GNode *, Boolean);
|
||||
char *Var_GetTail(const char *);
|
||||
char *Var_GetHead(const char *);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: parse.c,v 1.113 2006/03/31 21:05:34 dsl Exp $ */
|
||||
/* $NetBSD: parse.c,v 1.114 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.113 2006/03/31 21:05:34 dsl Exp $";
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.114 2006/03/31 21:58:08 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: parse.c,v 1.113 2006/03/31 21:05:34 dsl Exp $");
|
||||
__RCSID("$NetBSD: parse.c,v 1.114 2006/03/31 21:58:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -1004,14 +1004,12 @@ ParseDoDependency(char *line)
|
||||
* in the initial Var_Subst and we wouldn't be here.
|
||||
*/
|
||||
int length;
|
||||
Boolean freeIt;
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result=Var_Parse(cp, VAR_CMD, TRUE, &length, &freeIt);
|
||||
|
||||
if (freeIt) {
|
||||
free(result);
|
||||
}
|
||||
result = Var_Parse(cp, VAR_CMD, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
cp += length-1;
|
||||
}
|
||||
continue;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: suff.c,v 1.52 2006/01/08 12:59:52 dsl Exp $ */
|
||||
/* $NetBSD: suff.c,v 1.53 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: suff.c,v 1.52 2006/01/08 12:59:52 dsl Exp $";
|
||||
static char rcsid[] = "$NetBSD: suff.c,v 1.53 2006/03/31 21:58:08 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: suff.c,v 1.52 2006/01/08 12:59:52 dsl Exp $");
|
||||
__RCSID("$NetBSD: suff.c,v 1.53 2006/03/31 21:58:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -1582,16 +1582,15 @@ SuffExpandChildren(LstNode prevLN, GNode *pgn)
|
||||
*/
|
||||
char *junk;
|
||||
int len;
|
||||
Boolean doFree;
|
||||
void *freeIt;
|
||||
|
||||
junk = Var_Parse(cp, pgn, TRUE, &len, &doFree);
|
||||
junk = Var_Parse(cp, pgn, TRUE, &len, &freeIt);
|
||||
if (junk != var_Error) {
|
||||
cp += len - 1;
|
||||
}
|
||||
|
||||
if (doFree) {
|
||||
free(junk);
|
||||
}
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
} else if (*cp == '\\' && *cp != '\0') {
|
||||
/*
|
||||
* Escaped something -- skip over it
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: var.c,v 1.103 2006/03/19 01:54:21 sjg Exp $ */
|
||||
/* $NetBSD: var.c,v 1.104 2006/03/31 21:58:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: var.c,v 1.103 2006/03/19 01:54:21 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: var.c,v 1.104 2006/03/31 21:58:08 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: var.c,v 1.103 2006/03/19 01:54:21 sjg Exp $");
|
||||
__RCSID("$NetBSD: var.c,v 1.104 2006/03/31 21:58:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -1729,7 +1729,7 @@ VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate __unused,
|
||||
if (flags == NULL || (*flags & VAR_NOSUBST) == 0) {
|
||||
char *cp2;
|
||||
int len;
|
||||
Boolean freeIt;
|
||||
void *freeIt;
|
||||
|
||||
/*
|
||||
* If unescaped dollar sign not before the
|
||||
@ -1739,7 +1739,7 @@ VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate __unused,
|
||||
cp2 = Var_Parse(cp, ctxt, err, &len, &freeIt);
|
||||
Buf_AddBytes(buf, strlen(cp2), (Byte *)cp2);
|
||||
if (freeIt)
|
||||
free(cp2);
|
||||
free(freeIt);
|
||||
cp += len - 1;
|
||||
} else {
|
||||
const char *cp2 = &cp[1];
|
||||
@ -1886,9 +1886,10 @@ VarChangeCase(char *str, int upper)
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
/* coverity[+alloc : arg-*4] */
|
||||
char *
|
||||
Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
Boolean *freePtr)
|
||||
void **freePtr)
|
||||
{
|
||||
const char *tstr; /* Pointer into str */
|
||||
char *tstr2; /* Secondary tstr if we need
|
||||
@ -1913,7 +1914,7 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
* result is just the invocation, unaltered */
|
||||
Var_Parse_State parsestate; /* Flags passed to helper functions */
|
||||
|
||||
*freePtr = FALSE;
|
||||
*freePtr = NULL;
|
||||
dynamic = FALSE;
|
||||
start = str;
|
||||
parsestate.oneBigWord = FALSE;
|
||||
@ -1987,13 +1988,13 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
*/
|
||||
if (*tstr == '$') {
|
||||
int rlen;
|
||||
Boolean rfree;
|
||||
char *rval = Var_Parse(tstr, ctxt, err, &rlen, &rfree);
|
||||
void *freeIt;
|
||||
char *rval = Var_Parse(tstr, ctxt, err, &rlen, &freeIt);
|
||||
if (rval != NULL) {
|
||||
Buf_AddBytes(buf, strlen(rval), (Byte *)rval);
|
||||
if (rfree)
|
||||
free(rval);
|
||||
}
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
tstr += rlen - 1;
|
||||
}
|
||||
else
|
||||
@ -2062,7 +2063,7 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
* Resulting string is dynamically allocated, so
|
||||
* tell caller to free it.
|
||||
*/
|
||||
*freePtr = TRUE;
|
||||
*freePtr = val;
|
||||
*lengthPtr = tstr-start+1;
|
||||
*WR(tstr) = endc;
|
||||
Buf_Destroy(buf, TRUE);
|
||||
@ -2123,7 +2124,7 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
char *pstr = emalloc(*lengthPtr + 1);
|
||||
strncpy(pstr, start, *lengthPtr);
|
||||
pstr[*lengthPtr] = '\0';
|
||||
*freePtr = TRUE;
|
||||
*freePtr = pstr;
|
||||
Buf_Destroy(buf, TRUE);
|
||||
return(pstr);
|
||||
} else {
|
||||
@ -2164,7 +2165,7 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
nstr = (char *)Buf_GetAll(v->val, NULL);
|
||||
if (strchr(nstr, '$') != NULL) {
|
||||
nstr = Var_Subst(NULL, nstr, ctxt, err);
|
||||
*freePtr = TRUE;
|
||||
*freePtr = nstr;
|
||||
}
|
||||
|
||||
v->flags &= ~VAR_IN_USE;
|
||||
@ -2422,12 +2423,12 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
*/
|
||||
char *cp2;
|
||||
int len;
|
||||
Boolean freeIt;
|
||||
void *freeIt;
|
||||
|
||||
cp2 = Var_Parse(cp, ctxt, err, &len, &freeIt);
|
||||
Buf_AddBytes(buf, strlen(cp2), (Byte *)cp2);
|
||||
if (freeIt)
|
||||
free(cp2);
|
||||
free(freeIt);
|
||||
cp += len - 1;
|
||||
} else {
|
||||
Buf_AddByte(buf, (Byte)*cp);
|
||||
@ -3178,9 +3179,9 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
}
|
||||
nstr = newStr;
|
||||
if (nstr != var_Error && nstr != varNoError) {
|
||||
*freePtr = TRUE;
|
||||
*freePtr = nstr;
|
||||
} else {
|
||||
*freePtr = FALSE;
|
||||
*freePtr = NULL;
|
||||
}
|
||||
}
|
||||
if (termc == '\0') {
|
||||
@ -3209,7 +3210,7 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
* Returning the value unmodified, so tell the caller to free
|
||||
* the thing.
|
||||
*/
|
||||
*freePtr = TRUE;
|
||||
*freePtr = nstr;
|
||||
}
|
||||
if (nstr != (char *)Buf_GetAll(v->val, NULL))
|
||||
Buf_Destroy(v->val, destroy);
|
||||
@ -3225,12 +3226,12 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
if (*freePtr) {
|
||||
free(nstr);
|
||||
}
|
||||
*freePtr = FALSE;
|
||||
*freePtr = NULL;
|
||||
if (dynamic) {
|
||||
nstr = emalloc(*lengthPtr + 1);
|
||||
strncpy(nstr, start, *lengthPtr);
|
||||
nstr[*lengthPtr] = '\0';
|
||||
*freePtr = TRUE;
|
||||
*freePtr = nstr;
|
||||
} else {
|
||||
nstr = var_Error;
|
||||
}
|
||||
@ -3254,8 +3255,10 @@ Var_Parse(const char *str, GNode *ctxt, Boolean err, int *lengthPtr,
|
||||
|
||||
cleanup:
|
||||
*lengthPtr = cp - start + 1;
|
||||
if (*freePtr)
|
||||
if (*freePtr) {
|
||||
free(nstr);
|
||||
*freePtr = NULL;
|
||||
}
|
||||
if (tstr2)
|
||||
free(tstr2);
|
||||
if (delim != '\0')
|
||||
@ -3291,7 +3294,7 @@ Var_Subst(const char *var, const char *str, GNode *ctxt, Boolean undefErr)
|
||||
char *val; /* Value to substitute for a variable */
|
||||
int length; /* Length of the variable invocation */
|
||||
Boolean trailingBslash; /* variable ends in \ */
|
||||
Boolean doFree; /* Set true if val should be freed */
|
||||
void *freeIt = NULL; /* Set if it should be freed */
|
||||
static Boolean errorReported; /* Set true if an error has already
|
||||
* been reported to prevent a plethora
|
||||
* of messages when recursing */
|
||||
@ -3383,7 +3386,7 @@ Var_Subst(const char *var, const char *str, GNode *ctxt, Boolean undefErr)
|
||||
continue;
|
||||
}
|
||||
|
||||
val = Var_Parse(str, ctxt, undefErr, &length, &doFree);
|
||||
val = Var_Parse(str, ctxt, undefErr, &length, &freeIt);
|
||||
|
||||
/*
|
||||
* When we come down here, val should either point to the
|
||||
@ -3430,9 +3433,10 @@ Var_Subst(const char *var, const char *str, GNode *ctxt, Boolean undefErr)
|
||||
length = strlen(val);
|
||||
Buf_AddBytes(buf, length, (Byte *)val);
|
||||
trailingBslash = length > 0 && val[length - 1] == '\\';
|
||||
if (doFree) {
|
||||
free(val);
|
||||
}
|
||||
}
|
||||
if (freeIt) {
|
||||
free(freeIt);
|
||||
freeIt = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user