]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2024 14:33:10 +0000 (16:33 +0200)
[ Upstream commit c500a86693a126c9393e602741e348f80f1b0fc5 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pci/controller/dwc/pcie-kirin.c

index d5523f3021024cc96c6b239a2ca4a7bffde8b2e3..deab1e653b9a39ee181753a8ed2370bb8562f23c 100644 (file)
@@ -412,12 +412,12 @@ static int kirin_pcie_parse_port(struct kirin_pcie *pcie,
                        if (pcie->gpio_id_reset[i] < 0)
                                continue;
 
-                       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");
                                ret = -EINVAL;
                                goto put_node;
                        }
+                       pcie->num_slots++;
 
                        ret = of_pci_get_devfn(child);
                        if (ret < 0) {