From: Bolarinwa Olayemi Saheed <[email protected]>

On failure pcie_capability_read_dword() sets it's last parameter,
val to 0.
However, with Patch 14/14, it is possible that val is set to ~0 on
failure. This would introduce a bug because (x & x) == (~0 & x). 

This bug can be avoided if the return value of pcie_capability_read_word
is checked to confirm success.

Check the return value of pcie_capability_read_word() to ensure success.

Suggested-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Bolarinwa Olayemi Saheed <[email protected]>
---
 drivers/pci/pci-acpi.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index 7224b1e5f2a8..39eb816bc3b8 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -248,12 +248,13 @@ static bool pcie_root_rcb_set(struct pci_dev *dev)
 {
        struct pci_dev *rp = pcie_find_root_port(dev);
        u16 lnkctl;
+       int ret;
 
        if (!rp)
                return false;
 
-       pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl);
-       if (lnkctl & PCI_EXP_LNKCTL_RCB)
+       ret = pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl);
+       if (!ret && (lnkctl & PCI_EXP_LNKCTL_RCB))
                return true;
 
        return false;
@@ -792,12 +793,13 @@ bool pciehp_is_native(struct pci_dev *bridge)
 {
        const struct pci_host_bridge *host;
        u32 slot_cap;
+       int ret;
 
        if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
                return false;
 
-       pcie_capability_read_dword(bridge, PCI_EXP_SLTCAP, &slot_cap);
-       if (!(slot_cap & PCI_EXP_SLTCAP_HPC))
+       ret = pcie_capability_read_dword(bridge, PCI_EXP_SLTCAP, &slot_cap);
+       if (ret || !(slot_cap & PCI_EXP_SLTCAP_HPC))
                return false;
 
        if (pcie_ports_native)
-- 
2.18.2

Reply via email to