]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: kirin: Fix buffer overflow in kirin_pcie_parse_port()
authorAlexandra Diupina <adiupina@astralinux.ru>
Tue, 3 Sep 2024 11:58:23 +0000 (14:58 +0300)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Fri, 6 Sep 2024 06:36:29 +0000 (06:36 +0000)
Within kirin_pcie_parse_port(), the pcie->num_slots is compared to
pcie->gpio_id_reset size (MAX_PCI_SLOTS) which is correct and would lead
to an overflow.

Thus, fix condition to pcie->num_slots + 1 >= MAX_PCI_SLOTS and move
pcie->num_slots increment below the if-statement to avoid out-of-bounds
array access.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: b22dbbb24571 ("PCI: kirin: Support PERST# GPIOs for HiKey970 external PEX 8606 bridge")
Link: https://lore.kernel.org/linux-pci/20240903115823.30647-1-adiupina@astralinux.ru
Signed-off-by: Alexandra Diupina <adiupina@astralinux.ru>
[kwilczynski: commit log]
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/pci/controller/dwc/pcie-kirin.c

index 0a29136491b891e26015411f685370411566ae1e..85a2c77b1835af5f9f8f14b62442c82bbceac0eb 100644 (file)
@@ -420,11 +420,11 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
                                                     "unable to get a valid reset gpio\n");
                        }
 
-                       pcie->num_slots++;
-                       if (pcie->num_slots > MAX_PCI_SLOTS) {
+                       if (pcie->num_slots + 1 >= MAX_PCI_SLOTS) {
                                dev_err(dev, "Too many PCI slots!\n");
                                return -EINVAL;
                        }
+                       pcie->num_slots++;
 
                        ret = of_pci_get_devfn(child);
                        if (ret < 0) {