Skip to content

Commit

Permalink
usb: usb_wwan: resume/suspend can be called after port is gone
Browse files Browse the repository at this point in the history
We cannot unconditionally access any usb-serial port specific
data from the interface driver.  Both supending and resuming
may happen after the port has been removed and portdata is
freed.

Treat ports with no portdata as closed ports to avoid a NULL
pointer dereference on resume.  No need to kill URBs for
removed ports on suspend, avoiding the same NULL pointer
reference there.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Bjørn Mork authored and Greg Kroah-Hartman committed Aug 10, 2012
1 parent d5fd650 commit 032129c
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/usb/serial/usb_wwan.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,8 @@ static void stop_read_write_urbs(struct usb_serial *serial)
for (i = 0; i < serial->num_ports; ++i) {
port = serial->port[i];
portdata = usb_get_serial_port_data(port);
if (!portdata)
continue;
for (j = 0; j < N_IN_URB; j++)
usb_kill_urb(portdata->in_urbs[j]);
for (j = 0; j < N_OUT_URB; j++)
Expand Down Expand Up @@ -700,7 +702,7 @@ int usb_wwan_resume(struct usb_serial *serial)

/* skip closed ports */
spin_lock_irq(&intfdata->susp_lock);
if (!portdata->opened) {
if (!portdata || !portdata->opened) {
spin_unlock_irq(&intfdata->susp_lock);
continue;
}
Expand Down

0 comments on commit 032129c

Please sign in to comment.