diff options
author | Nico Huber <nico.h@gmx.de> | 2022-08-05 12:44:11 +0200 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2022-08-15 19:22:20 +0000 |
commit | 4b864e5c308fd0e4efdc1a99b7216c89f5ef0570 (patch) | |
tree | a320a899d5ed7beb8fda8d6dcb4ba88dcf434298 | |
parent | ebc36c1b48cc91cb96b6435cc768a6a5e7043c90 (diff) |
pciexp_device: Fix pciexp_find_next_extended_cap()
If we already encountered the last extended capability in the
list, we'd call pciexp_get_ext_cap_offset() with `offset == 0`.
So it also needs to check if the passed offset is valid.
As there were no callers of pciexp_find_next_extended_cap()
yet, pciexp_get_ext_cap_offset() was only ever called with
`PCIE_EXT_CAP_OFFSET`.
Change-Id: I155c4691a34ff16661919913a3446fa915ac535e
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/66452
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Bill XIE <persmule@hardenedlinux.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
-rw-r--r-- | src/device/pciexp_device.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/device/pciexp_device.c b/src/device/pciexp_device.c index ac4e668f08..694f1dd275 100644 --- a/src/device/pciexp_device.c +++ b/src/device/pciexp_device.c @@ -13,7 +13,7 @@ static unsigned int pciexp_get_ext_cap_offset(const struct device *dev, unsigned { unsigned int this_cap_offset = offset; unsigned int next_cap_offset, this_cap, cafe; - do { + while (this_cap_offset != 0) { this_cap = pci_read_config32(dev, this_cap_offset); /* Bail out when this request is unsupported */ if (this_cap == 0xffffffff) @@ -27,7 +27,7 @@ static unsigned int pciexp_get_ext_cap_offset(const struct device *dev, unsigned next_cap_offset = this_cap >> 20; this_cap_offset = next_cap_offset; } - } while (next_cap_offset != 0); + } return 0; } |