[libvirt] [PATCH] Fix minor issues in libxenlight managed save

Jim Fehlig jfehlig at novell.com
Thu Jun 2 22:04:40 UTC 2011


There were a few minor issues in commit 5b6c961e
- leak managed save path
- leak managed save fd
- functions that open an fd should also close it
---
 src/libxl/libxl_driver.c |   30 ++++++++++++++++++++----------
 1 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 9a794e8..ed24d10 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -632,23 +632,27 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
     int ret;
     uint32_t domid = 0;
     char *dom_xml = NULL;
-    char *managed_save = NULL;
+    char *managed_save_path = NULL;
+    int managed_save_fd = -1;
     pid_t child_console_pid = -1;
     libxlDomainObjPrivatePtr priv = vm->privateData;
 
     /* If there is a managed saved state restore it instead of starting
      * from scratch. The old state is removed once the restoring succeeded. */
     if (restore_fd < 0) {
-        managed_save = libxlDomainManagedSavePath(driver, vm);
-        if (managed_save == NULL)
+        managed_save_path = libxlDomainManagedSavePath(driver, vm);
+        if (managed_save_path == NULL)
             goto error;
 
-        if (virFileExists(managed_save)) {
+        if (virFileExists(managed_save_path)) {
 
-            restore_fd = libxlSaveImageOpen(driver, managed_save, &def, &hdr);
-            if (restore_fd < 0)
+            managed_save_fd = libxlSaveImageOpen(driver, managed_save_path,
+                                                 &def, &hdr);
+            if (managed_save_fd < 0)
                 goto error;
 
+            restore_fd = managed_save_fd;
+
             if (STRNEQ(vm->def->name, def->name) ||
                 memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) {
                 char vm_uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -665,9 +669,12 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
             virDomainObjAssignDef(vm, def, true);
             def = NULL;
 
-            if (unlink(managed_save) < 0)
-                VIR_WARN("Failed to remove the managed state %s", managed_save);
+            if (unlink(managed_save_path) < 0) {
+                VIR_WARN("Failed to remove the managed state %s",
+                         managed_save_path);
+            }
         }
+        VIR_FREE(managed_save_path);
     }
 
     memset(&d_config, 0, sizeof(d_config));
@@ -738,6 +745,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
 
     libxl_domain_config_destroy(&d_config);
     VIR_FREE(dom_xml);
+    VIR_FORCE_CLOSE(managed_save_fd);
     return 0;
 
 error:
@@ -748,9 +756,9 @@ error:
     }
     libxl_domain_config_destroy(&d_config);
     VIR_FREE(dom_xml);
-    VIR_FREE(managed_save);
+    VIR_FREE(managed_save_path);
     virDomainDefFree(def);
-    VIR_FORCE_CLOSE(restore_fd);
+    VIR_FORCE_CLOSE(managed_save_fd);
     return -1;
 }
 
@@ -1955,6 +1963,8 @@ libxlDomainRestore(virConnectPtr conn, const char *from)
     }
 
 cleanup:
+    if (VIR_CLOSE(fd) < 0)
+        virReportSystemError(errno, "%s", _("cannot close file"));
     virDomainDefFree(def);
     if (vm)
         virDomainObjUnlock(vm);
-- 
1.7.3.1




More information about the libvir-list mailing list