]> xenbits.xensource.com Git - libvirt.git/commitdiff
pci: Fix virPCIGetPhysicalFunction()'s callers
authorAndrea Bolognani <abologna@redhat.com>
Wed, 25 May 2016 08:01:58 +0000 (10:01 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Wed, 25 May 2016 08:38:01 +0000 (10:38 +0200)
Commit c8b1a83605e4 changed the function, making it
impossible for callers to be able to tell whether a
non-negative return value means "physical function
address found and parsed correctly" or "couldn't find
corresponding physical function".

The important difference between the two being that,
in the latter case, the returned pointer is NULL and
should never, ever be dereferenced.

In order to cope with these changes, the callers
have to be updated.

src/node_device/node_device_linux_sysfs.c
src/util/virpci.c

index 24a6a2eaa51f8f0aa181cd62d5b7a238cd68ddf4..549d32c4b93ecb253dd59e9e6d3c7264a84a283c 100644 (file)
@@ -154,19 +154,25 @@ nodeDeviceSysfsGetPCISRIOVCaps(const char *sysfsPath,
     data->pci_dev.flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
     data->pci_dev.flags &= ~VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
 
-    if (!virPCIGetPhysicalFunction(sysfsPath, &data->pci_dev.physical_function))
+    ret = virPCIGetPhysicalFunction(sysfsPath,
+                                    &data->pci_dev.physical_function);
+    if (ret < 0)
+        goto cleanup;
+
+    if (data->pci_dev.physical_function)
         data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
 
     ret = virPCIGetVirtualFunctions(sysfsPath, &data->pci_dev.virtual_functions,
                                     &data->pci_dev.num_virtual_functions,
                                     &data->pci_dev.max_virtual_functions);
     if (ret < 0)
-        return ret;
+        goto cleanup;
 
     if (data->pci_dev.num_virtual_functions > 0 ||
         data->pci_dev.max_virtual_functions > 0)
         data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
 
+ cleanup:
     return ret;
 }
 
index 28da2948726ebb0767a381c7d7732020cce2431e..095d7068c24407f74733f0dcb5c25a8c569f59d4 100644 (file)
@@ -2732,6 +2732,9 @@ virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
     if (virPCIGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0)
         return ret;
 
+    if (!pf_config_address)
+        return ret;
+
     if (virPCIDeviceAddressGetSysfsFile(pf_config_address,
                                         &pf_sysfs_device_path) < 0) {