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:
christos 2006-03-31 21:58:08 +00:00
parent 3d342ea626
commit e052a053e4
6 changed files with 104 additions and 90 deletions

View File

@ -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++;

View File

@ -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;
}
}

View File

@ -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 *);

View File

@ -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;

View File

@ -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

View File

@ -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;
}
}
}