PCI: fix upstream P2P bridge checks when enabling OBFF and LTR
pci_enable_obff() and pci_enable_ltr() incorrectly check "dev->bus" instead of "dev->bus->self" to determine whether the upstream device is a P2P bridge or a host bridge. For devices on the root bus, the upstream device is a host bridge, "dev->bus != NULL" and "dev->bus->self == NULL", and we panic with a null pointer dereference. These functions should previously have panicked when called on devices supporting OBFF or LTR, so they should be regarded as untested. Found by Coverity (CID 143038 and CID 143039). Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
d6d88c832e
commit
8291550f84
1 changed files with 2 additions and 2 deletions
|
@ -2108,7 +2108,7 @@ int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type type)
|
||||||
return -ENOTSUPP; /* no OBFF support at all */
|
return -ENOTSUPP; /* no OBFF support at all */
|
||||||
|
|
||||||
/* Make sure the topology supports OBFF as well */
|
/* Make sure the topology supports OBFF as well */
|
||||||
if (dev->bus) {
|
if (dev->bus->self) {
|
||||||
ret = pci_enable_obff(dev->bus->self, type);
|
ret = pci_enable_obff(dev->bus->self, type);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2215,7 +2215,7 @@ int pci_enable_ltr(struct pci_dev *dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Enable upstream ports first */
|
/* Enable upstream ports first */
|
||||||
if (dev->bus) {
|
if (dev->bus->self) {
|
||||||
ret = pci_enable_ltr(dev->bus->self);
|
ret = pci_enable_ltr(dev->bus->self);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue