All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nirmoy Das <nirmoyd@nvidia.com>
To: <bhelgaas@google.com>
Cc: <make24@iscas.ac.cn>, <linux-pci@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, Nirmoy Das <nirmoyd@nvidia.com>,
	<stable@vger.kernel.org>
Subject: [PATCH] PCI: Fix host bridge double put in pci_register_host_bridge()
Date: Mon, 19 Oct 2026 09:16:36 -0700	[thread overview]
Message-ID: <20261019161636.2540334-1-nirmoyd@nvidia.com> (raw)

When device_register() fails for the root bus, the unregister path in
pci_register_host_bridge() drops a bridge reference with put_device()
and then releases the bus with put_device(&bus->dev). The bus release
callback, release_pcibus_dev(), also drops bus->bridge, so the bridge
loses two references for the one taken when the bus was set up.

This frees the host bridge before pci_register_host_bridge() returns.
The caller then drops its own reference on freed memory, either in
pci_create_root_bus() or in the devres action of
devm_pci_alloc_host_bridge().

KASAN reports the use after free in pci_host_probe() when the bus device
registration fails:

  BUG: KASAN: slab-use-after-free in pci_host_probe+0x17c/0x180
  Read of size 8 at addr ffff00000699d840 by task insmod/61
  Freed by task 61:
   kfree+0x274/0x4ec
   pci_release_host_bridge_dev+0x88/0xa4
   device_release+0x9c/0x1ec
   kobject_put+0x138/0x24c
   put_device+0x10/0x1c
   release_pcibus_dev+0x30/0x60
   device_release+0x9c/0x1ec
   kobject_put+0x138/0x24c
   put_device+0x10/0x1c
   pci_register_host_bridge+0x63c/0x1244
   pci_scan_root_bus_bridge+0x110/0x24c
   pci_host_probe+0x34/0x180
  refcount_t: underflow; use-after-free.

Tested on arm64 under QEMU/KVM with KASAN, using a test module that
occupies the pci_bus sysfs name so that device_register() of the root bus
fails with -EEXIST. With the fix, pci_host_probe() returns the error and
the devres teardown completes without KASAN or refcount warnings.

Fixes: 804443c1f278 ("PCI: Fix reference leak in pci_register_host_bridge()")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Signed-off-by: Nirmoy Das <nirmoyd@nvidia.com>
---
 drivers/pci/probe.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 9a178e0e5f7f467..86dbfd4873963e8 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1149,7 +1149,6 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
 	return 0;
 
 unregister:
-	put_device(&bridge->dev);
 	device_del(&bridge->dev);
 free:
 #ifdef CONFIG_PCI_DOMAINS_GENERIC
-- 
2.43.0


             reply	other threads:[~2026-10-19 16:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-19 16:16 Nirmoy Das [this message]
2026-10-19 16:24 ` [PATCH] PCI: Fix host bridge double put in pci_register_host_bridge() sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261019161636.2540334-1-nirmoyd@nvidia.com \
    --to=nirmoyd@nvidia.com \
    --cc=bhelgaas@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=make24@iscas.ac.cn \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.