[libvirt] [PATCH 5/5] libxl: Fix cleanup on domain start error

Osier Yang jyang at redhat.com
Thu Jan 17 03:40:19 UTC 2013


On 2013年01月17日 01:17, Jim Fehlig wrote:
> Osier Yang wrote:
>> On 2013年01月16日 07:15, Jim Fehlig wrote:
>>> If building the libxl domain config fails, cleanup before returning
>>> failure.
>>> ---
>>>    src/libxl/libxl_driver.c | 2 +-
>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
>>> index baa05e8..6da0272 100644
>>> --- a/src/libxl/libxl_driver.c
>>> +++ b/src/libxl/libxl_driver.c
>>> @@ -769,7 +769,7 @@ libxlVmStart(libxlDriverPrivatePtr driver,
>>> virDomainObjPtr vm,
>>>        libxl_domain_config_init(&d_config);
>>>
>>>        if (libxlBuildDomainConfig(driver, vm->def,&d_config)<   0)
>>> -        return -1;
>>> +        goto error;
>>>
>>>        if (libxlFreeMem(priv,&d_config)<   0) {
>>>            virReportError(VIR_ERR_INTERNAL_ERROR,
>>
>>              vm->hasManagedSave = false;
>>          }
>>          VIR_FREE(managed_save_path);
>>
>> This can be removed. It's freed in "error". But I'm fine if you keep it
>> there when pushing. ACK
>
> But managed_save_path would be leaked on success then.
>
Oh, okay, I see. But after looking at the codes one more step.

     libxl_domain_config_dispose(&d_config);
     VIR_FREE(dom_xml);
     VIR_FORCE_CLOSE(managed_save_fd);
     return 0;

error:
     if (domid > 0) {
         libxl_domain_destroy(priv->ctx, domid, NULL);
         vm->def->id = -1;
         virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, 
VIR_DOMAIN_SHUTOFF_FAILED);
     }
     libxl_domain_config_dispose(&d_config);
     VIR_FREE(dom_xml);
     VIR_FREE(managed_save_path);
     virDomainDefFree(def);
     VIR_FORCE_CLOSE(managed_save_fd);
     return -1;

I see this can be simplified as (not looking through all the
codes, so the 'ret < 0' checking might be not correct, but it
shows the idea):

     ret = 0;
cleanup:
     if (ret < 0 && domid > 0) {
         libxl_domain_destroy(priv->ctx, domid, NULL);
         vm->def->id = -1;
         virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, 
VIR_DOMAIN_SHUTOFF_FAILED);
     }
     libxl_domain_config_dispose(&d_config);
     VIR_FREE(dom_xml);
     VIR_FREE(managed_save_path);
     if (ret < 0)
         virDomainDefFree(def);
     VIR_FORCE_CLOSE(managed_save_fd);
     return ret;

And thus the previous "VIR_FREE(managed_save_path);" can be avoided.

Regards,
Osier




More information about the libvir-list mailing list