
On 23.05.2013 15:56, John Ferlan wrote:
On 05/23/2013 09:44 AM, Michal Privoznik wrote:
On 23.05.2013 15:04, John Ferlan wrote:
On 05/20/2013 01:55 PM, Michal Privoznik wrote:
--- [...snip...]
diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index 2509c0d..ac5f7ed 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -79,19 +79,15 @@ virNWFilterVarValueCopy(const virNWFilterVarValuePtr val)
switch (res->valType) { case NWFILTER_VALUE_TYPE_SIMPLE: - if (val->u.simple.value) { - res->u.simple.value = strdup(val->u.simple.value); - if (!res->u.simple.value) - goto err_exit; - } + if (VIR_STRDUP(res->u.simple.value, val->u.simple.value) < 0) + goto err_exit; break; case NWFILTER_VALUE_TYPE_ARRAY: if (VIR_ALLOC_N(res->u.array.values, val->u.array.nValues) < 0) goto err_exit; res->u.array.nValues = val->u.array.nValues; for (i = 0; i < val->u.array.nValues; i++) { - str = strdup(val->u.array.values[i]); - if (!str) + if (VIR_STRDUP(str, val->u.array.values[i]) < 0) goto err_exit; res->u.array.values[i] = str; } @@ -133,12 +129,10 @@ virNWFilterVarValueCreateSimple(char *value) virNWFilterVarValuePtr virNWFilterVarValueCreateSimpleCopyValue(const char *value) { - char *val = strdup(value); + char *val;
- if (!val) { - virReportOOMError(); + if (VIR_STRDUP(val, value) < 0) return NULL; - } return virNWFilterVarValueCreateSimple(val); }
@@ -654,17 +648,15 @@ virNWFilterHashTablePut(virNWFilterHashTablePtr table, { if (!virHashLookup(table->hashTable, name)) { if (copyName) { - name = strdup(name); - if (!name) { - virReportOOMError(); + char *newName; + if (VIR_STRDUP(newName, name) < 0) return -1; - }
if (VIR_REALLOC_N(table->names, table->nNames + 1) < 0) { VIR_FREE(name); return -1; } - table->names[table->nNames++] = (char *)name; + table->names[table->nNames++] = newName; }
Coverity complains (see below too)
648 {
(1) Event cond_true: Condition "!virHashLookup(table->hashTable, name)", taking true branch
649 if (!virHashLookup(table->hashTable, name)) {
(2) Event cond_true: Condition "copyName", taking true branch
650 if (copyName) { 651 char *newName;
(3) Event cond_false: Condition "virStrdup(&newName, name, true /* 1 */, VIR_FROM_NWFILTER, "conf/nwfilter_params.c", <anonymous>, 652) < 0", taking false branch
652 if (VIR_STRDUP(newName, name) < 0) 653 return -1; 654
(5) Event cond_false: Condition "virReallocN(&table->names, 8UL /* sizeof (*table->names) */, table->nNames + 1) < 0", taking false branch
655 if (VIR_REALLOC_N(table->names, table->nNames + 1) < 0) { 656 VIR_FREE(name); 657 return -1;
(6) Event if_end: End of if statement
658 } 659 table->names[table->nNames++] = newName; 660 } 661
(7) Event cond_true: Condition "virHashAddEntry(table->hashTable, name, val) < 0", taking true branch
662 if (virHashAddEntry(table->hashTable, name, val) < 0) {
(8) Event cond_true: Condition "copyName", taking true branch
663 if (copyName) {
(9) Event freed_arg: "virFree(void *)" frees parameter "name". [details]
664 VIR_FREE(name); 665 table->nNames--; 666 } 667 return -1; 668 }
In particular, the "VIR_FREE(name)" causes a problem in one of the callers, see below. So I think the fix is to dump "newNames" up one level, then change:
664 VIR_FREE(name); 665 table->nNames--;
to
664 VIR_FREE(newName); 665 table->nNames--;
John
Right, it took me a while to parse the coverity output, and here's the part of the original code that confused me:
if (!virHashLookup(table->hashTable, name)) { if (copyName) { name = strdup(name);
Taking advantage that when returned to the caller name is what it was...
The following seems right (that is use newName instead of name locally):
diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index ac5f7ed..44b9f05 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -647,13 +647,13 @@ virNWFilterHashTablePut(virNWFilterHashTablePtr table, int copyName) { if (!virHashLookup(table->hashTable, name)) { + char *newName = NULL; if (copyName) { - char *newName; if (VIR_STRDUP(newName, name) < 0) return -1;
if (VIR_REALLOC_N(table->names, table->nNames + 1) < 0) { - VIR_FREE(name); + VIR_FREE(newName); return -1; } table->names[table->nNames++] = newName; @@ -661,7 +661,7 @@ virNWFilterHashTablePut(virNWFilterHashTablePtr table,
if (virHashAddEntry(table->hashTable, name, val) < 0) { if (copyName) { - VIR_FREE(name); + VIR_FREE(newName); table->nNames--; } return -1;
Yup, that's exactly the patch that I wrote (haven't send it though yet). ACK if you want to push it. Michal