Skip to content

Commit c1846ed

Browse files
oneukumgregkh
authored andcommitted
USB: wdm: close race between wdm_open and wdm_wwan_port_stop
Clearing WDM_WWAN_IN_USE must be the last action or we can open a chardev whose URBs are still poisoned Fixes: cac6fb0 ("usb: class: cdc-wdm: WWAN framework integration") Cc: stable <stable@kernel.org> Signed-off-by: Oliver Neukum <oneukum@suse.com> Link: https://lore.kernel.org/r/20250401084749.175246-3-oneukum@suse.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9697f5e commit c1846ed

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/usb/class/cdc-wdm.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ static int wdm_open(struct inode *inode, struct file *file)
726726
rv = -EBUSY;
727727
goto out;
728728
}
729-
729+
smp_rmb(); /* ordered against wdm_wwan_port_stop() */
730730
rv = usb_autopm_get_interface(desc->intf);
731731
if (rv < 0) {
732732
dev_err(&desc->intf->dev, "Error autopm - %d\n", rv);
@@ -868,8 +868,10 @@ static void wdm_wwan_port_stop(struct wwan_port *port)
868868
poison_urbs(desc);
869869
desc->manage_power(desc->intf, 0);
870870
clear_bit(WDM_READ, &desc->flags);
871-
clear_bit(WDM_WWAN_IN_USE, &desc->flags);
872871
unpoison_urbs(desc);
872+
smp_wmb(); /* ordered against wdm_open() */
873+
/* this must be last lest we open a poisoned device */
874+
clear_bit(WDM_WWAN_IN_USE, &desc->flags);
873875
}
874876

875877
static void wdm_wwan_port_tx_complete(struct urb *urb)

0 commit comments

Comments
 (0)