| From 5cefb52c1af6f69ea719e42788f6ec6a087eb74c Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 10 Mar 2026 11:51:27 +0100 |
| Subject: gpib: lpvo_usb: fix memory leak on disconnect |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 5cefb52c1af6f69ea719e42788f6ec6a087eb74c upstream. |
| |
| 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 | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c |
| +++ b/drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c |
| @@ -406,7 +406,7 @@ static int usb_gpib_attach(struct gpib_b |
| 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_b |
| 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 && |