[libvirt] [PATCHv2] network: Avoid memory leaks on networkBuildDnsmasqArgv

Alex Jia ajia at redhat.com
Sun Jan 29 05:25:43 UTC 2012


On 01/20/2012 04:43 AM, Eric Blake wrote:
> On 01/18/2012 03:04 AM, ajia at redhat.com wrote:
>> From: Alex Jia<ajia at redhat.com>
>>
>> Detected by valgrind. Leaks introduced in commit 973af236.
>>
>> * src/network/bridge_driver.c: fix memory leaks on failure and successful path.
>>
>> * How to reproduce?
>> % make -C tests check TESTS=networkxml2argvtest
>> % cd tests&&  valgrind -v --leak-check=full ./networkxml2argvtest
>>
>>   src/network/bridge_driver.c |    9 ++++++---
>>   1 files changed, 6 insertions(+), 3 deletions(-)
> Needs a v3.
>
>> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
>> index 5d0d528..5bd5a50 100644
>> --- a/src/network/bridge_driver.c
>> +++ b/src/network/bridge_driver.c
>> @@ -459,6 +459,9 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
>>       int r, ret = -1;
>>       int nbleases = 0;
>>       int ii;
>> +    char *recordPort = NULL;
>> +    char *recordPriority = NULL;
>> +    char *recordWeight = NULL;
>>       virNetworkIpDefPtr tmpipdef;
> Moving the declaration here, and a cleanup at the end, will only free
> _one_ instance of allocation.
>
>>
>>       /*
>> @@ -530,9 +533,6 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
>>
>>           for (i = 0; i<  dns->nsrvrecords; i++) {
>>               char *record = NULL;
>> -            char *recordPort = NULL;
>> -            char *recordPriority = NULL;
>> -            char *recordWeight = NULL;
> But these values were allocated in a for loop, so if there is more than
> one nsrvrecords, then you are leaking on each iteration of the loop.
>
>>
>>               if (dns->srvrecords[i].service&&  dns->srvrecords[i].protocol) {
>>                   if (dns->srvrecords[i].port) {
>> @@ -671,6 +671,9 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
>>
>>       ret = 0;
>>   cleanup:
>> +    VIR_FREE(recordPort);
>> +    VIR_FREE(recordWeight);
>> +    VIR_FREE(recordPriority);
> You need to also copy these three lines into the end of the for loop.
>
Yeah, these values were allocated in a for loop, so also should free 
them in a loop, thanks for
your comment, and will commit a v3 now.

Regards,
Alex




More information about the libvir-list mailing list