]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
USB: ulpi: fix memory leak on registration failure
authorJohan Hovold <johan@kernel.org>
Mon, 8 Jun 2026 14:58:03 +0000 (16:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jun 2026 14:11:27 +0000 (15:11 +0100)
The allocated device name is never freed on early ULPI device
registration failures.

Fix this by initialising the device structure earlier and releasing the
initial reference whenever registration fails.

Fixes: 289fcff4bcdb ("usb: add bus type for USB ULPI")
Cc: stable <stable@kernel.org>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260608145803.69360-1-johan@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/common/ulpi.c

index 9b69148128e5bf8f1c0fb69633eb5f0d3d92d41f..7e43429e996e7ab3d181607603ec277f3fe00b0d 100644 (file)
@@ -281,28 +281,24 @@ static int ulpi_register(struct device *dev, struct ulpi *ulpi)
        ulpi->dev.parent = dev; /* needed early for ops */
        ulpi->dev.bus = &ulpi_bus;
        ulpi->dev.type = &ulpi_dev_type;
+
+       device_initialize(&ulpi->dev);
+
        dev_set_name(&ulpi->dev, "%s.ulpi", dev_name(dev));
 
        ACPI_COMPANION_SET(&ulpi->dev, ACPI_COMPANION(dev));
 
        ret = ulpi_of_register(ulpi);
-       if (ret) {
-               kfree(ulpi);
+       if (ret)
                return ret;
-       }
 
        ret = ulpi_read_id(ulpi);
-       if (ret) {
-               of_node_put(ulpi->dev.of_node);
-               kfree(ulpi);
+       if (ret)
                return ret;
-       }
 
-       ret = device_register(&ulpi->dev);
-       if (ret) {
-               put_device(&ulpi->dev);
+       ret = device_add(&ulpi->dev);
+       if (ret)
                return ret;
-       }
 
        root = debugfs_create_dir(dev_name(&ulpi->dev), ulpi_root);
        debugfs_create_file("regs", 0444, root, ulpi, &ulpi_regs_fops);
@@ -334,9 +330,10 @@ struct ulpi *ulpi_register_interface(struct device *dev,
        ulpi->ops = ops;
 
        ret = ulpi_register(dev, ulpi);
-       if (ret)
+       if (ret) {
+               put_device(&ulpi->dev);
                return ERR_PTR(ret);
-
+       }
 
        return ulpi;
 }