From 22039ef94a8f6e7f4fc04648dc5a0ee857927be3 Mon Sep 17 00:00:00 2001 From: Andrew Goodbody Date: Mon, 7 Jul 2025 17:26:53 +0100 Subject: [PATCH] pci: Assign a default value on reads on error Many callers of PCI read functions do not check the return value for error before using the variable that should contain the value read were there not to be an error. However in the error case this variable is never assigned to and so will contain uninitialised data. To provide some certainty as to behaviour in the error case assign a default value of all bits set. This issue found by Smatch. Signed-off-by: Andrew Goodbody --- drivers/pci/pci-uclass.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c index 59894d2430b..c370f8c6400 100644 --- a/drivers/pci/pci-uclass.c +++ b/drivers/pci/pci-uclass.c @@ -385,8 +385,10 @@ static int pci_read_config(pci_dev_t bdf, int offset, unsigned long *valuep, int ret; ret = pci_get_bus(PCI_BUS(bdf), &bus); - if (ret) + if (ret) { + *valuep = 0xffffffff; return ret; + } return pci_bus_read_config(bus, bdf, offset, valuep, size); } @@ -408,8 +410,10 @@ int pci_read_config32(pci_dev_t bdf, int offset, u32 *valuep) int ret; ret = pci_read_config(bdf, offset, &value, PCI_SIZE_32); - if (ret) + if (ret) { + *valuep = 0xffffffff; return ret; + } *valuep = value; return 0; @@ -421,8 +425,10 @@ int pci_read_config16(pci_dev_t bdf, int offset, u16 *valuep) int ret; ret = pci_read_config(bdf, offset, &value, PCI_SIZE_16); - if (ret) + if (ret) { + *valuep = 0xffff; return ret; + } *valuep = value; return 0; @@ -434,8 +440,10 @@ int pci_read_config8(pci_dev_t bdf, int offset, u8 *valuep) int ret; ret = pci_read_config(bdf, offset, &value, PCI_SIZE_8); - if (ret) + if (ret) { + *valuep = 0xff; return ret; + } *valuep = value; return 0; @@ -447,8 +455,10 @@ int dm_pci_read_config8(const struct udevice *dev, int offset, u8 *valuep) int ret; ret = dm_pci_read_config(dev, offset, &value, PCI_SIZE_8); - if (ret) + if (ret) { + *valuep = 0xff; return ret; + } *valuep = value; return 0; @@ -460,8 +470,10 @@ int dm_pci_read_config16(const struct udevice *dev, int offset, u16 *valuep) int ret; ret = dm_pci_read_config(dev, offset, &value, PCI_SIZE_16); - if (ret) + if (ret) { + *valuep = 0xffff; return ret; + } *valuep = value; return 0; @@ -473,8 +485,10 @@ int dm_pci_read_config32(const struct udevice *dev, int offset, u32 *valuep) int ret; ret = dm_pci_read_config(dev, offset, &value, PCI_SIZE_32); - if (ret) + if (ret) { + *valuep = 0xffffffff; return ret; + } *valuep = value; return 0; -- 2.47.2