Skip to content

Commit f2924d4

Browse files
romain-izard-progregkh
authored andcommitted
usb: cdc_acm: Do not leak URB buffers
When the ACM TTY port is disconnected, the URBs it uses must be killed, and then the buffers must be freed. Unfortunately a previous refactor removed the code freeing the buffers because it looked extremely similar to the code killing the URBs. As a result, there were many new leaks for each plug/unplug cycle of a CDC-ACM device, that were detected by kmemleak. Restore the missing code, and the memory leak is removed. Fixes: ba8c931 ("cdc-acm: refactor killing urbs") Signed-off-by: Romain Izard <romain.izard.pro@gmail.com> Acked-by: Oliver Neukum <oneukum@suse.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent dcb44ac commit f2924d4

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

drivers/usb/class/cdc-acm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,7 @@ static void acm_disconnect(struct usb_interface *intf)
15141514
{
15151515
struct acm *acm = usb_get_intfdata(intf);
15161516
struct tty_struct *tty;
1517+
int i;
15171518

15181519
/* sibling interface is already cleaning up */
15191520
if (!acm)
@@ -1544,6 +1545,11 @@ static void acm_disconnect(struct usb_interface *intf)
15441545

15451546
tty_unregister_device(acm_tty_driver, acm->minor);
15461547

1548+
usb_free_urb(acm->ctrlurb);
1549+
for (i = 0; i < ACM_NW; i++)
1550+
usb_free_urb(acm->wb[i].urb);
1551+
for (i = 0; i < acm->rx_buflimit; i++)
1552+
usb_free_urb(acm->read_urbs[i]);
15471553
acm_write_buffers_free(acm);
15481554
usb_free_coherent(acm->dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
15491555
acm_read_buffers_free(acm);

0 commit comments

Comments
 (0)