[libvirt] [PATCH] virnetdev: Resolve some Coverity issues

John Ferlan jferlan at redhat.com
Wed Oct 29 22:17:44 UTC 2014



On 10/29/2014 05:44 PM, Eric Blake wrote:
> On 10/29/2014 03:28 PM, John Ferlan wrote:
>> Coverity discovered a few issues with recent changes in this module
>> from commit id 'cc0e8c24'.  This patches fixes those.
> 
> Might be nice to summarize what those errors were.
> 
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/util/virnetdev.c | 37 +++++++++++++++++++++----------------
>>  1 file changed, 21 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
>> index 127bfb2..8bd1af4 100644
>> --- a/src/util/virnetdev.c
>> +++ b/src/util/virnetdev.c
>> @@ -59,15 +59,20 @@ VIR_LOG_INIT("util.netdev");
>>  #define PROC_NET_DEV_MCAST "/proc/net/dev_mcast"
>>  #define MAX_MCAST_SIZE 50*14336
>>  #define VIR_MCAST_NAME_LEN (IFNAMSIZ + 1)
>> -#define VIR_MCAST_INDEX_TOKEN_IDX 0
>> -#define VIR_MCAST_NAME_TOKEN_IDX 1
>> -#define VIR_MCAST_USERS_TOKEN_IDX 2
>> -#define VIR_MCAST_GLOBAL_TOKEN_IDX 3
>> -#define VIR_MCAST_ADDR_TOKEN_IDX 4
>>  #define VIR_MCAST_NUM_TOKENS 5
> 
> Is VIR_MCAST_NUM_TOKENS still used after this patch?  Or can you delete
> it in favor of...
> 

yeah - forgot to go back and remove that line.

>>  #define VIR_MCAST_TOKEN_DELIMS " \n"
>>  #define VIR_MCAST_ADDR_LEN (VIR_MAC_HEXLEN + 1)
>>  
>> +typedef enum {
>> +    VIR_MCAST_TYPE_INDEX_TOKEN,
>> +    VIR_MCAST_TYPE_NAME_TOKEN,
>> +    VIR_MCAST_TYPE_USERS_TOKEN,
>> +    VIR_MCAST_TYPE_GLOBAL_TOKEN,
>> +    VIR_MCAST_TYPE_ADDR_TOKEN,
>> +
>> +    VIR_MCAST_TYPE_LAST
> 
> ...this?
> 
> 
>>  
>> -        switch (ifindex) {
>> -            case VIR_MCAST_INDEX_TOKEN_IDX:
>> +        switch ((virMCastType)ifindex) {
>> +            case VIR_MCAST_TYPE_INDEX_TOKEN:
>>                  if (virStrToLong_i(token, &endptr, 10, &num) < 0) {
>>                      virReportSystemError(EINVAL,
> 
>> @@ -2135,7 +2140,9 @@ static int virNetDevParseMcast(char *buf, virNetDevMcastEntryPtr mcast)
>>                                           buf);
>>                  }
>>                  break;
>> -            default:
>> +
>> +            /* coverity[dead_error_begin] */
>> +            case VIR_MCAST_TYPE_LAST:
>>                  break;
> 
> Okay, I can see what you did so far (convert from #defines to an enum to
> let the compiler warn if we miss any cases, including a way to silence
> Coverity about the known-dead branch of the switch).
> 

Correct - issue #1 (of 4)

>>          }
>>      }
>> @@ -2194,9 +2201,7 @@ static int virNetDevGetMcastList(const char *ifname,
>>  
>>      ret = 0;
>>   cleanup:
>> -    if (ret < 0)
>> -        virNetDevMcastListClear(mcast);
>> -
>> +    VIR_FREE(buf);
> 
> But this one doesn't have any context in the commit message at why it is
> needed.  However, in looking at the function itself and the referenced
> commit that introduced the problem, I agree with the fix.  ACK, although
> it might be better to do this as two separate commits.
> 

OK - I'll separate these into separate patches... These are coverity
issues 2, 3, & 4.  There's a followup to the Extend NIC_RX_* series that
I made just before this that pointed out that there's a path where
calling virNetDevMcastListClear in this context if we jumped here after
failing the virFileReadAll, then there'd be a NULL deref on
mcast->entries. When I looked at the code - the calling function to this
will make the same Clear call on failure.

The final 2 Coverity issues were resource leaks on buf, but Coverity
also says "cur" is leaked resulting in a twofer.

Even though you've ACK'd, I'll split things up and repost anyway for
clarity.

John




More information about the libvir-list mailing list