starfire_init_one() enables the PCI device but leaves it enabled on subsequent probe failures. Route all failures after successful enablement through pci_disable_device(), preserving the existing error codes and resource unwind order. This issue is already present in the initial Git import; its pre-Git introduction is unknown. This issue was identified during our ongoing static-analysis research while reviewing kernel code. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Assisted-by: LLM Co-developed-by: Ijae Kim Signed-off-by: Ijae Kim Signed-off-by: Myeonghun Pak --- drivers/net/ethernet/adaptec/starfire.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/adaptec/starfire.c b/drivers/net/ethernet/adaptec/starfire.c index f1109d9..f7bd765 100644 --- a/drivers/net/ethernet/adaptec/starfire.c +++ b/drivers/net/ethernet/adaptec/starfire.c @@ -638,6 +638,7 @@ static int starfire_init_one(struct pci_dev *pdev, void __iomem *base; int drv_flags, io_size; int boguscnt; + int err = -ENODEV; if (pci_enable_device (pdev)) return -EIO; @@ -646,12 +647,14 @@ static int starfire_init_one(struct pci_dev *pdev, io_size = pci_resource_len(pdev, 0); if (!ioaddr || ((pci_resource_flags(pdev, 0) & IORESOURCE_MEM) == 0)) { dev_err(d, "no PCI MEM resources, aborting\n"); - return -ENODEV; + goto err_out_disable; } dev = alloc_etherdev(sizeof(*np)); - if (!dev) - return -ENOMEM; + if (!dev) { + err = -ENOMEM; + goto err_out_disable; + } SET_NETDEV_DEV(dev, &pdev->dev); @@ -818,7 +821,9 @@ err_out_free_res: pci_release_regions (pdev); err_out_free_netdev: free_netdev(dev); - return -ENODEV; +err_out_disable: + pci_disable_device(pdev); + return err; }