PCI: Check for pci_setup_device() failure in pci_iov_add_virtfn()
authorPo Liu <po.liu@nxp.com>
Mon, 29 Aug 2016 07:28:01 +0000 (15:28 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 12 Sep 2016 21:23:38 +0000 (16:23 -0500)
If pci_setup_device() returns failure, we must return failure from
pci_iov_add_virtfn().  If we ignore the failure and continue with an
uninitialized pci_dev for virtfn, we crash later when we try to use those
uninitialized parts.

Signed-off-by: Po Liu <po.liu@nxp.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/iov.c

index 2194b447201d412127e0d2111856c868561a983c..e30f05c8517f17c92d2bb5d947e83132505fc939 100644 (file)
@@ -136,7 +136,10 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int reset)
        virtfn->devfn = pci_iov_virtfn_devfn(dev, id);
        virtfn->vendor = dev->vendor;
        pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device);
-       pci_setup_device(virtfn);
+       rc = pci_setup_device(virtfn);
+       if (rc)
+               goto failed0;
+
        virtfn->dev.parent = dev->dev.parent;
        virtfn->physfn = pci_dev_get(dev);
        virtfn->is_virtfn = 1;