diff --git a/usr.bin/make/arch.c b/usr.bin/make/arch.c index 6082f1ea0304..043299079fc9 100644 --- a/usr.bin/make/arch.c +++ b/usr.bin/make/arch.c @@ -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 #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++; diff --git a/usr.bin/make/cond.c b/usr.bin/make/cond.c index 3cdd3078c68c..3e163c498aac 100644 --- a/usr.bin/make/cond.c +++ b/usr.bin/make/cond.c @@ -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 #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; } } diff --git a/usr.bin/make/nonints.h b/usr.bin/make/nonints.h index e55a892303a3..8b16d00e1dbd 100644 --- a/usr.bin/make/nonints.h +++ b/usr.bin/make/nonints.h @@ -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 *); diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index 6a23a4f90123..dcca2dbefd57 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -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 #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; diff --git a/usr.bin/make/suff.c b/usr.bin/make/suff.c index 31bac29f0a57..a2582d9ab66c 100644 --- a/usr.bin/make/suff.c +++ b/usr.bin/make/suff.c @@ -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 #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 diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index c02660b6da59..51cdfac8930d 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -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 #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; } } }