mirror of
https://github.com/torvalds/linux.git
synced 2026-03-13 22:36:17 +01:00
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: cac6fb015f ("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>
This commit is contained in:
parent
9697f5efcf
commit
c1846ed4eb
1 changed files with 4 additions and 2 deletions
|
|
@ -726,7 +726,7 @@ static int wdm_open(struct inode *inode, struct file *file)
|
|||
rv = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
smp_rmb(); /* ordered against wdm_wwan_port_stop() */
|
||||
rv = usb_autopm_get_interface(desc->intf);
|
||||
if (rv < 0) {
|
||||
dev_err(&desc->intf->dev, "Error autopm - %d\n", rv);
|
||||
|
|
@ -868,8 +868,10 @@ static void wdm_wwan_port_stop(struct wwan_port *port)
|
|||
poison_urbs(desc);
|
||||
desc->manage_power(desc->intf, 0);
|
||||
clear_bit(WDM_READ, &desc->flags);
|
||||
clear_bit(WDM_WWAN_IN_USE, &desc->flags);
|
||||
unpoison_urbs(desc);
|
||||
smp_wmb(); /* ordered against wdm_open() */
|
||||
/* this must be last lest we open a poisoned device */
|
||||
clear_bit(WDM_WWAN_IN_USE, &desc->flags);
|
||||
}
|
||||
|
||||
static void wdm_wwan_port_tx_complete(struct urb *urb)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue