]> xenbits.xensource.com Git - libvirt.git/commitdiff
nodedev: fix pci express memory leak
authorEric Blake <eblake@redhat.com>
Wed, 23 Jul 2014 04:38:30 +0000 (22:38 -0600)
committerEric Blake <eblake@redhat.com>
Mon, 28 Jul 2014 20:10:29 +0000 (14:10 -0600)
Leak introduced in commit 16ebf10f (v1.2.6), detected by valgrind:

==9816== 216 (96 direct, 120 indirect) bytes in 6 blocks are definitely lost in loss record 665 of 821
==9816==    at 0x4A081D4: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==9816==    by 0x50836FB: virAlloc (viralloc.c:144)
==9816==    by 0x1DBDBE27: udevProcessPCI (node_device_udev.c:546)
==9816==    by 0x1DBDD79D: udevGetDeviceDetails (node_device_udev.c:1293)

* src/util/virpci.h (virPCIEDeviceInfoFree): New prototype.
* src/util/virpci.c (virPCIEDeviceInfoFree): New function.
* src/conf/node_device_conf.c (virNodeDevCapsDefFree): Clear
pci_express under pci case.
(virNodeDevCapPCIDevParseXML): Avoid leak.
* src/node_device/node_device_udev.c (udevProcessPCI): Likewise.
* src/libvirt_private.syms (virpci.h): Export it.

Signed-off-by: Eric Blake <eblake@redhat.com>
src/conf/node_device_conf.c
src/libvirt_private.syms
src/node_device/node_device_udev.c
src/util/virpci.c
src/util/virpci.h

index b244a1f0c8038b388938683087f200c5678bde03..78bc63f13d5d197adfd71b95cdf1fa417bbecf2e 100644 (file)
@@ -1291,7 +1291,7 @@ virNodeDevCapPCIDevParseXML(xmlXPathContextPtr ctxt,
 
     ret = 0;
  out:
-    VIR_FREE(pci_express);
+    virPCIEDeviceInfoFree(pci_express);
     ctxt->node = orignode;
     return ret;
 }
@@ -1664,6 +1664,7 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
             VIR_FREE(data->pci_dev.iommuGroupDevices[i]);
         }
         VIR_FREE(data->pci_dev.iommuGroupDevices);
+        virPCIEDeviceInfoFree(data->pci_dev.pci_express);
         break;
     case VIR_NODE_DEV_CAP_USB_DEV:
         VIR_FREE(data->usb_dev.product_name);
index b1fb7c944324ac61e4eaf9ef7746391ef07c278e..cafe86689ddd24a18150899711e6d438c5cb00fc 100644 (file)
@@ -1753,6 +1753,7 @@ virPCIDeviceSetUnbindFromStub;
 virPCIDeviceSetUsedBy;
 virPCIDeviceUnbind;
 virPCIDeviceWaitForCleanup;
+virPCIEDeviceInfoFree;
 virPCIGetNetName;
 virPCIGetPhysicalFunction;
 virPCIGetVirtualFunctionIndex;
index 28d2953e660a3a756902faefa24d1c4ce4cad099..0fe474d4e35308c1162837cbdc2572dea4cc75ac 100644 (file)
@@ -570,7 +570,7 @@ static int udevProcessPCI(struct udev_device *device,
 
  out:
     virPCIDeviceFree(pciDev);
-    VIR_FREE(pci_express);
+    virPCIEDeviceInfoFree(pci_express);
     return ret;
 }
 
index b7400e994f82e43067be4abbc03bc41e4cbd1b0f..0098d6c47215324e024676e919dd463a81b53fa1 100644 (file)
@@ -2847,3 +2847,15 @@ virPCIDeviceGetLinkCapSta(virPCIDevicePtr dev,
     virPCIDeviceConfigClose(dev, fd);
     return ret;
 }
+
+
+void
+virPCIEDeviceInfoFree(virPCIEDeviceInfoPtr dev)
+{
+    if (!dev)
+        return;
+
+    VIR_FREE(dev->link_cap);
+    VIR_FREE(dev->link_sta);
+    VIR_FREE(dev);
+}
index 3d274878e1081bd03b13095de6417b4faf33777a..1ce9821e003ad2f6bb5315e1a0e171df5855c582 100644 (file)
@@ -212,4 +212,7 @@ int virPCIDeviceGetLinkCapSta(virPCIDevicePtr dev,
                               unsigned int *cap_width,
                               unsigned int *sta_speed,
                               unsigned int *sta_width);
+
+void virPCIEDeviceInfoFree(virPCIEDeviceInfoPtr dev);
+
 #endif /* __VIR_PCI_H__ */