]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
pci: initialize virtual_functions array pointer to avoid segfault
authorLaine Stump <laine@laine.org>
Mon, 1 Jul 2013 03:52:43 +0000 (23:52 -0400)
committerLaine Stump <laine@laine.org>
Mon, 1 Jul 2013 04:26:33 +0000 (00:26 -0400)
This fixes https://bugzilla.redhat.com/show_bug.cgi?id=971325

The problem was that if virPCIGetVirtualFunctions was given the name
of a non-existent interface, it would return to its caller without
initializing the pointer to the array of virtual functions to NULL,
and the caller (virNetDevGetVirtualFunctions) would try to VIR_FREE()
the invalid pointer.

The final error message before the crash would be:

 virPCIGetVirtualFunctions:2088 :
  Failed to open dir '/sys/class/net/eth2/device':
  No such file or directory

In this patch I move the initialization in virPCIGetVirtualFunctions()
to the begining of the function, and also do an explicit
initialization in virNetDevGetVirtualFunctions, just in case someone
in the future adds code into that function prior to the call to
virPCIGetVirtualFunctions.

src/util/virnetdev.c
src/util/virpci.c

index ebe20d09fba9603ff505ea26fa7f7552fe29de02..5e8dffb2044b70d3b38e4c8c6c5c4c14a0275bf5 100644 (file)
@@ -1100,6 +1100,9 @@ virNetDevGetVirtualFunctions(const char *pfname,
     char *pci_sysfs_device_link = NULL;
     char *pciConfigAddr = NULL;
 
+    *virt_fns = NULL;
+    *n_vfname = 0;
+
     if (virNetDevSysfsFile(&pf_sysfs_device_link, pfname, "device") < 0)
         return ret;
 
index 7d83bdb3c4c61aaa21af86c9a807c28c997d8a9a..54f771531d920c6312a26c54f0b5fdd2b9516d8f 100644 (file)
@@ -2425,6 +2425,9 @@ virPCIGetVirtualFunctions(const char *sysfs_path,
     VIR_DEBUG("Attempting to get SR IOV virtual functions for device"
               "with sysfs path '%s'", sysfs_path);
 
+    *virtual_functions = NULL;
+    *num_virtual_functions = 0;
+
     dir = opendir(sysfs_path);
     if (dir == NULL) {
         memset(errbuf, '\0', sizeof(errbuf));
@@ -2434,8 +2437,6 @@ virPCIGetVirtualFunctions(const char *sysfs_path,
         return ret;
     }
 
-    *virtual_functions = NULL;
-    *num_virtual_functions = 0;
     while ((entry = readdir(dir))) {
         if (STRPREFIX(entry->d_name, "virtfn")) {
             virPCIDeviceAddress *config_addr = NULL;