[libvirt] [PATCH] conf: resctrl object is not properly handled

Michal Privoznik mprivozn at redhat.com
Tue Aug 20 13:38:59 UTC 2019


On 8/20/19 3:18 PM, Daniel Henrique Barboza wrote:
> 
> 
> On 8/20/19 7:06 AM, Wang Huaqiang wrote:
>> resctrl object stored in def->resctrls is shared by cachetune and
>> memorytune. The domain xml configuration is parsed firstly for
>> cachetune then memorytune, and the resctrl object will not be created
>> in parsing settings for memorytune once it found sharing exists.
>>
>> But resctrl is improperly freed when sharing happens.
>>
>> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
>> ---
>>   src/conf/domain_conf.c                    | 12 +++++-------
>>   tests/genericxml2xmlindata/memorytune.xml |  4 ++++
>>   2 files changed, 9 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 617ccac..604e006 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -19590,7 +19590,6 @@ virDomainMemorytuneDefParse(virDomainDefPtr def,
>>       VIR_AUTOUNREF(virResctrlAllocPtr) alloc = NULL;
>>       ssize_t i = 0;
>>       int n;
>> -    int ret = -1;
>>       ctxt->node = node;
>> @@ -19632,14 +19631,13 @@ virDomainMemorytuneDefParse(virDomainDefPtr 
>> def,
>>           if (!(resctrl = virDomainResctrlNew(node, alloc, vcpus, 
>> flags)))
>>               return -1;
>> -        if (VIR_APPEND_ELEMENT(def->resctrls, def->nresctrls, 
>> resctrl) < 0)
>> -            goto cleanup;
>> +        if (VIR_APPEND_ELEMENT(def->resctrls, def->nresctrls, 
>> resctrl) < 0) {
>> +            virDomainResctrlDefFree(resctrl);
>> +            return -1;
>> +        }
>>       }
>> -    ret = 0;
>> - cleanup:
>> -    virDomainResctrlDefFree(resctrl);
>> -    return ret;
>> +    return 0;
>>   }
> 
> This could also be fixed by putting the free into a conditional:
> 
> if (resctrl)
>      virDomainRescrtlDefFree(resctrl);

Not really. We want to free @resctrl only if it's a newly allocated 
struct. In case the pointer was obtained via virDomainResctrlVcpuMatch() 
then we must not free it (even though it is not NULL).

Reviewed-by: Michal Privoznik <mprivozn at redhat.com>

And pushed. Thanks for fixing this.

Michal




More information about the libvir-list mailing list