[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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



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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]