]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpib: lpvo_usb: fix memory leak on disconnect
authorJohan Hovold <johan@kernel.org>
Tue, 10 Mar 2026 10:51:27 +0000 (11:51 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2026 12:30:30 +0000 (14:30 +0200)
The driver iterates over the registered USB interfaces during GPIB
attach and takes a reference to their USB devices until a match is
found. These references are never released which leads to a memory leak
when devices are disconnected.

Fix the leak by dropping the unnecessary references.

Fixes: fce79512a96a ("staging: gpib: Add LPVO DIY USB GPIB driver")
Cc: stable <stable@kernel.org> # 6.13
Cc: Dave Penkler <dpenkler@gmail.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260310105127.17538-1-johan@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c

index ee781d2f0b8e1d19ce2b1242b5762c9ce35d04b0..0f9d385bc50b526e2279c8a81f550e6244e9ce17 100644 (file)
@@ -406,7 +406,7 @@ static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_con
                for (j = 0 ; j < MAX_DEV ; j++) {
                        if ((assigned_usb_minors & 1 << j) == 0)
                                continue;
-                       udev =  usb_get_dev(interface_to_usbdev(lpvo_usb_interfaces[j]));
+                       udev = interface_to_usbdev(lpvo_usb_interfaces[j]);
                        device_path = kobject_get_path(&udev->dev.kobj, GFP_KERNEL);
                        match = gpib_match_device_path(&lpvo_usb_interfaces[j]->dev,
                                                       config->device_path);
@@ -421,7 +421,7 @@ static int usb_gpib_attach(struct gpib_board *board, const struct gpib_board_con
                for (j = 0 ; j < MAX_DEV ; j++) {
                        if ((assigned_usb_minors & 1 << j) == 0)
                                continue;
-                       udev =  usb_get_dev(interface_to_usbdev(lpvo_usb_interfaces[j]));
+                       udev = interface_to_usbdev(lpvo_usb_interfaces[j]);
                        DIA_LOG(1, "dev. %d: bus %d -> %d  dev: %d -> %d\n", j,
                                udev->bus->busnum, config->pci_bus, udev->devnum, config->pci_slot);
                        if (config->pci_bus == udev->bus->busnum &&