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;


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to