]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: pata_sl82c105: fix bridge revision use-after-free
authorHongyan Xu <getshell@seu.edu.cn>
Thu, 6 Aug 2026 06:06:28 +0000 (14:06 +0800)
committerDamien Le Moal <dlemoal@kernel.org>
Thu, 6 Aug 2026 15:55:53 +0000 (00:55 +0900)
pci_get_slot() returns a referenced PCI device. Commit 44c10138fd4b
("PCI: Change all drivers to use pci_device->revision") replaced a
configuration-space read with direct access to the cached revision field,
but left that access after pci_dev_put(). The bridge may therefore be freed
before its revision is read.

Read the revision before dropping the reference.

Fixes: 44c10138fd4b ("PCI: Change all drivers to use pci_device->revision")
Signed-off-by: Hongyan Xu <getshell@seu.edu.cn>
Reviewed-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
drivers/ata/pata_sl82c105.c

index 2d24c6b3e9d9fb72ad46c2e09780164af7b9810e..25bce3fe2a101dc87e083d51fc7b437458271408 100644 (file)
@@ -264,6 +264,7 @@ static struct ata_port_operations sl82c105_port_ops = {
 static int sl82c105_bridge_revision(struct pci_dev *pdev)
 {
        struct pci_dev *bridge;
+       u8 revision;
 
        /*
         * The bridge should be part of the same device, but function 0.
@@ -285,8 +286,9 @@ static int sl82c105_bridge_revision(struct pci_dev *pdev)
        /*
         * We need to find function 0's revision, not function 1
         */
+       revision = bridge->revision;
        pci_dev_put(bridge);
-       return bridge->revision;
+       return revision;
 }
 
 static void sl82c105_fixup(struct pci_dev *pdev)