
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