[libvirt] [PATCH 2/2] Fix leak in PCI hostdev hot-unplug

Mark McLoughlin markmc at redhat.com
Thu Sep 17 15:03:00 UTC 2009


* src/qemu_driver.c: sync the hostdev hot-unplug code with the disk/net
  code.
---
 src/qemu_driver.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index de31581..2ddcdc0 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -6206,14 +6206,20 @@ static int
qemudDomainDetachHostPciDevice(virConnectPtr conn,
         pciFreeDevice(conn, pci);
     }
 
-    if (i != --vm->def->nhostdevs)
-        memmove(&vm->def->hostdevs[i],
-                &vm->def->hostdevs[i+1],
-                sizeof(*vm->def->hostdevs) * (vm->def->nhostdevs-i));
-    if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs) < 0) {
-        virReportOOMError(conn);
-        ret = -1;
+    if (vm->def->nhostdevs > 1) {
+        memmove(vm->def->hostdevs + i,
+                vm->def->hostdevs + i + 1,
+                sizeof(*vm->def->hostdevs) *
+                (vm->def->nhostdevs - (i + 1)));
+        vm->def->nhostdevs--;
+        if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs) < 0) {
+            /* ignore, harmless */
+        }
+    } else {
+        VIR_FREE(vm->def->hostdevs);
+        vm->def->nhostdevs = 0;
     }
+    virDomainHostdevDefFree(detach);
 
     return ret;
 }
-- 
1.6.2.5




More information about the libvir-list mailing list