[libvirt] [PATCH 05/13] domain_conf: Resolve resource leaks found by Valgrind

John Ferlan jferlan at redhat.com
Thu Feb 7 18:49:59 UTC 2013


On 02/06/2013 09:06 PM, Osier Yang wrote:
> On 2013年02月07日 05:35, John Ferlan wrote:
>> Fix various resource leaks discovered while parsing through Valgrind
>> output
>> ---
>>   src/conf/domain_conf.c | 12 +++++++++++-
>>   1 file changed, 11 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 27f5b5e..62a604f 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -7604,6 +7604,7 @@ virDomainVideoDefParseXML(const xmlNodePtr node,
>>       VIR_FREE(ram);
>>       VIR_FREE(vram);
>>       VIR_FREE(heads);
>> +    VIR_FREE(primary);
>>
>>       return def;
>>
>> @@ -9587,6 +9588,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>                       }
>>
>>                       if ((value =
>> virDomainFeatureStateTypeFromString(tmp))<  0) {
>> +                        VIR_FREE(tmp);
>>                           virReportError(VIR_ERR_XML_ERROR,
>>                                          _("invalid value of state
>> argument "
>>                                            "for HyperV Enlightenment
>> feature '%s'"),
>> @@ -9594,6 +9596,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>                           goto error;
>>                       }
>>
>> +                    VIR_FREE(tmp);
>>                       def->hyperv_features[feature] = value;
>>                       break;
> 
> Good to fix the leak in the similar hunk as well:
> 
>                 tmp = virXPathString("string(./features/apic/@eoi)", ctxt);
>                 if (tmp) {
>                     int eoi;
>                     if ((eoi = virDomainFeatureStateTypeFromString(tmp))
> <= 0) {
>                         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                                        _("unknown value for attribute
> eoi: %s"),
>                                        tmp);
>                         goto error;
>                     }
>                     def->apic_eoi = eoi;
>                     VIR_FREE(tmp);
>                 }
> 
> 
>>
>> @@ -9922,6 +9925,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>           if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
>>               if (controller->model ==
>> VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) {
>>                   if (usb_other || usb_none) {
>> +                    virDomainControllerDefFree(controller);
>>                       virReportError(VIR_ERR_XML_DETAIL, "%s",
>>                                      _("Can't add another USB
>> controller: "
>>                                        "USB is disabled for this
>> domain"));
>> @@ -9930,6 +9934,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>                   usb_none = true;
>>               } else {
>>                   if (usb_none) {
>> +                    virDomainControllerDefFree(controller);
>>                       virReportError(VIR_ERR_XML_DETAIL, "%s",
>>                                      _("Can't add another USB
>> controller: "
>>                                        "USB is disabled for this
>> domain"));
>> @@ -10227,6 +10232,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>
>>           /* Check if USB bus is required */
>>           if (input->bus == VIR_DOMAIN_INPUT_BUS_USB&&  usb_none) {
>> +            virDomainInputDefFree(input);
>>               virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>                              _("Can't add USB input device. "
>>                                "USB bus is disabled"));
>> @@ -10324,6 +10330,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>
>>           if (video->primary) {
>>               if (primaryVideo) {
>> +                virDomainVideoDefFree(video);
>>                   virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>                                  _("Only one primary video device is
>> supported"));
>>                   goto error;
>> @@ -10335,8 +10342,10 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>           if (VIR_INSERT_ELEMENT_INPLACE(def->videos,
>>                                          ii,
>>                                          def->nvideos,
>> -                                       video)<  0)
>> +                                       video)<  0) {
>> +            virDomainVideoDefFree(video);
>>               goto error;
>> +        }
>>       }
>>       VIR_FREE(nodes);
>>
>> @@ -10452,6 +10461,7 @@ static virDomainDefPtr
>> virDomainDefParseXML(virCapsPtr caps,
>>               goto error;
>>
>>           if (hub->type == VIR_DOMAIN_HUB_TYPE_USB&&  usb_none) {
>> +            virDomainHubDefFree(hub);
>>               virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>                              _("Can't add USB hub: "
>>                                "USB is disabled for this domain"));
> 
> ACK with fixing the similar hunk.


In retrospect, the virDomainDefParseXML() will VIR_FREE(tmp) in the
error: path, so rather than add within the error path as I did at line
9592 and the error path for "./features/apic/@eoi", I removed that one
line.

I probably added that one as a result of adding the one in the non error
path and hyper-focusing on the code on the screen around the change.

John




More information about the libvir-list mailing list