]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
driver core: reject devices with unregistered buses
authorJohan Hovold <johan@kernel.org>
Thu, 30 Apr 2026 09:17:18 +0000 (11:17 +0200)
committerDanilo Krummrich <dakr@kernel.org>
Sat, 2 May 2026 15:50:50 +0000 (17:50 +0200)
Trying to register a device on a bus which has not yet been registered
used to trigger a NULL-pointer dereference, but since the const bus
structure rework registration instead succeeds without the device being
added to the bus.

This specifically means that the device will never bind to a driver and
that the bus sysfs attributes are not created (i.e. as if the device had
no bus).

Reject devices with unregistered buses to catch any callers that get
the ordering wrong and to handle bus registration failures more
gracefully.

Fixes: 5221b82d46f2 ("driver core: bus: bus_add/probe/remove_device() cleanups")
Cc: stable@vger.kernel.org # 6.3
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260430091718.230228-1-johan@kernel.org
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
drivers/base/bus.c

index 8b6722ff8590df0c31db955e939dd342ce10e708..d17bd91490ee4e7022b46cd889f0c1cefce49a02 100644 (file)
@@ -544,10 +544,10 @@ static const struct attribute_group driver_override_dev_group = {
  */
 int bus_add_device(struct device *dev)
 {
-       struct subsys_private *sp = bus_to_subsys(dev->bus);
+       struct subsys_private *sp;
        int error;
 
-       if (!sp) {
+       if (!dev->bus) {
                /*
                 * This is a normal operation for many devices that do not
                 * have a bus assigned to them, just say that all went
@@ -556,6 +556,13 @@ int bus_add_device(struct device *dev)
                return 0;
        }
 
+       sp = bus_to_subsys(dev->bus);
+       if (!sp) {
+               pr_err("%s: cannot add device '%s' to unregistered bus '%s'\n",
+                      __func__, dev_name(dev), dev->bus->name);
+               return -EINVAL;
+       }
+
        /*
         * Reference in sp is now incremented and will be dropped when
         * the device is removed from the bus