All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Kevin Lloyd <linux@sierrawireless.com>,
	Johannes H?lzl <johannes.hoelzl@gmx.de>,
	Kevin Lloyd <klloyd@sierrawireless.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	linux-usb-devel@lists.sourceforge.net
Subject: Re: 2.6.21-rc4: NULL pointer dereference oops when unplugging sierra device
Date: Wed, 21 Mar 2007 14:53:09 -0700	[thread overview]
Message-ID: <20070321215309.GA18940@suse.de> (raw)
In-Reply-To: <4601A3B9.3030701@goop.org>

[-- Attachment #1: Type: text/plain, Size: 3448 bytes --]

On Wed, Mar 21, 2007 at 02:29:29PM -0700, Jeremy Fitzhardinge wrote:
> My laptop has a built-in Sierra wireless device.  When I flicked the
> switch to disable it, which effectively unplugs the USB device, I got
> this oops:
> 
> sierra3 ttyUSB0: Sierra USB modem (3 port) converter now disconnected from ttyUSB0
> PM: Removing info for usb-serial:ttyUSB0
> PM: Removing info for No Bus:ttyUSB1
> sierra3 ttyUSB1: Sierra USB modem (3 port) converter now disconnected from ttyUSB1
> PM: Removing info for usb-serial:ttyUSB1
> PM: Removing info for No Bus:ttyUSB2
> sierra3 ttyUSB2: Sierra USB modem (3 port) converter now disconnected from ttyUSB2
> PM: Removing info for usb-serial:ttyUSB2
> BUG: unable to handle kernel NULL pointer dereference at virtual address 0000018c
>  printing eip:
> f8e52cd7
> *pde = 34187001
> Oops: 0000 [#1]
> SMP 
> Modules linked in: ppp_deflate zlib_deflate ppp_async crc_ccitt ppp_generic slhc sierra usbserial i915 drm
>  autofs4 hidp rfcomm l2cap bluetooth xt_tcpudp iptable_filter ip_tables x_tables vfat fat video ibm_acpi p
> arport_pc lp parport snd_hda_intel snd_hda_codec snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_
> seq_device snd_pcm_oss wlan_scan_sta snd_mixer_oss snd_pcm ath_rate_sample ath_pci mmc_block wlan sdhci sn
> d_timer pcspkr e1000 snd soundcore sg ohci1394 ath_hal mmc_core snd_page_alloc ieee1394 rtc_cmos rtc_core 
> serio_raw rtc_lib rtc ehci_hcd uhci_hcd
> CPU:    0
> EIP:    0060:[<f8e52cd7>]    Not tainted VLI
> EFLAGS: 00010246   (2.6.21-rc4 #126)
> EIP is at sierra_shutdown+0x3a/0x113 [sierra]
> eax: 00000000   ebx: 00000000   ecx: 00000000   edx: f8e52c9d
> esi: 00000000   edi: e889fa1c   ebp: e84c0e2c   esp: e84c0e0c
> ds: 007b   es: 007b   fs: 00d8  gs: 0033  ss: 0068
> Process pppd (pid: 3847, ti=e84c0000 task=e8553550 task.ti=e84c0000)
> Stack: 00000002 e84c0e18 c01cfda8 e84c0e20 c0240431 e889fa1c 00000003 e8a79d00 
>        e84c0e50 f8e219e4 f8e5212d 00000021 00000000 00000000 00000000 e889fa50 
>        f8e21956 e84c0e70 c01d099a e84c0e78 f8e52c58 e84c0e6c f6c5576c f6c55760 
> Call Trace:
>  [<c0104e98>] show_trace_log_lvl+0x1a/0x2f
>  [<c0104f4a>] show_stack_log_lvl+0x9d/0xa5
>  [<c0105114>] show_registers+0x1c2/0x293
>  [<c0105307>] die+0x122/0x224
>  [<c030fe69>] do_page_fault+0x505/0x5e1
>  [<c030e5c4>] error_code+0x7c/0x84
>  [<f8e219e4>] destroy_serial+0x8e/0x124 [usbserial]
>  [<c01d099a>] kref_put+0x63/0x71
>  [<f8e217f0>] usb_serial_put+0x10/0x12 [usbserial]
>  [<f8e2194e>] serial_close+0xb6/0xbe [usbserial]
>  [<c0225290>] release_dev+0x1f0/0x5f9
>  [<c02256ab>] tty_release+0x12/0x1c
>  [<c0167cf2>] __fput+0xb8/0x162
>  [<c0167db3>] fput+0x17/0x19
>  [<c016591c>] filp_close+0x54/0x5c
>  [<c01668cd>] sys_close+0x63/0x97
>  [<c0103f04>] syscall_call+0x7/0xb
>  =======================
> Code: e5 f8 00 74 1c c7 44 24 08 97 2e e5 f8 c7 44 24 04 06 2f e5 f8 c7 04 24 22 2f e5 f8 e8 47 ff 2c c7 3
> 1 f6 eb 4c 8b 44 b7 14 31 db <8b> 80 8c 01 00 00 89 45 ec 8b 55 ec 8b 04 9a 85 c0 74 0b 83 78 
> EIP: [<f8e52cd7>] sierra_shutdown+0x3a/0x113 [sierra] SS:ESP 0068:e84c0e0c
> 
> 
> This was compiled from git change
> 0a14fe6e5efd0af0f9c6c01e0433445d615d0110.  .config attached.  The
> hardware is a Lenovo ThinkPad X60, with the integrated Verizon Sierra
> wireless modem:

Hm, do the two patches attached below fix this problem for you?

The second one might not be needed, but it is there for "correctness" :)

thanks,

greg k-h

[-- Attachment #2: usb-sierra-close-race.patch --]
[-- Type: text/plain, Size: 1909 bytes --]

>From oneukum@suse.de Tue Mar 20 05:54:01 2007
From: Oliver Neukum <oneukum@suse.de>
To: Kevin Lloyd <linux@sierrawireless.com>, Greg KH <gregkh@suse.de>
Subject: USB: sierra close race
Date: Tue, 20 Mar 2007 13:54:05 +0100
Message-Id: <200703201354.06455.oneukum@suse.de>

the sierra driver does not directly use usb_kill_urb(). It uses a wrapper.
This wrapper means that callbacks which are running are not killed during
close, resubmitting and illicitly pushing data into the tty layer.
The whole purpose of usb_kill_urb() is subverted. The wrapper must be removed.
The same problem as the option driver.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/usb/serial/sierra.c |   14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -456,12 +456,6 @@ static int sierra_open(struct usb_serial
 	return (0);
 }
 
-static inline void stop_urb(struct urb *urb)
-{
-	if (urb && urb->status == -EINPROGRESS)
-		usb_kill_urb(urb);
-}
-
 static void sierra_close(struct usb_serial_port *port, struct file *filp)
 {
 	int i;
@@ -479,9 +473,9 @@ static void sierra_close(struct usb_seri
 
 		/* Stop reading/writing urbs */
 		for (i = 0; i < N_IN_URB; i++)
-			stop_urb(portdata->in_urbs[i]);
+			usb_unlink_urb(portdata->in_urbs[i]);
 		for (i = 0; i < N_OUT_URB; i++)
-			stop_urb(portdata->out_urbs[i]);
+			usb_unlink_urb(portdata->out_urbs[i]);
 	}
 	port->tty = NULL;
 }
@@ -585,9 +579,9 @@ static void sierra_shutdown(struct usb_s
 		port = serial->port[i];
 		portdata = usb_get_serial_port_data(port);
 		for (j = 0; j < N_IN_URB; j++)
-			stop_urb(portdata->in_urbs[j]);
+			usb_unlink_urb(portdata->in_urbs[j]);
 		for (j = 0; j < N_OUT_URB; j++)
-			stop_urb(portdata->out_urbs[j]);
+			usb_unlink_urb(portdata->out_urbs[j]);
 	}
 
 	/* Now free them */

[-- Attachment #3: sierra.patch --]
[-- Type: text/plain, Size: 1120 bytes --]

---
 drivers/usb/serial/sierra.c |   11 +++++++++++
 1 file changed, 11 insertions(+)

--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -577,7 +577,12 @@ static void sierra_shutdown(struct usb_s
 	/* Stop reading/writing urbs */
 	for (i = 0; i < serial->num_ports; ++i) {
 		port = serial->port[i];
+		if (!port)
+			continue;
 		portdata = usb_get_serial_port_data(port);
+		if (!portdata)
+			continue;
+
 		for (j = 0; j < N_IN_URB; j++)
 			usb_unlink_urb(portdata->in_urbs[j]);
 		for (j = 0; j < N_OUT_URB; j++)
@@ -587,7 +592,11 @@ static void sierra_shutdown(struct usb_s
 	/* Now free them */
 	for (i = 0; i < serial->num_ports; ++i) {
 		port = serial->port[i];
+		if (!port)
+			continue;
 		portdata = usb_get_serial_port_data(port);
+		if (!portdata)
+			continue;
 
 		for (j = 0; j < N_IN_URB; j++) {
 			if (portdata->in_urbs[j]) {
@@ -606,6 +615,8 @@ static void sierra_shutdown(struct usb_s
 	/* Now free per port private data */
 	for (i = 0; i < serial->num_ports; i++) {
 		port = serial->port[i];
+		if (!port)
+			continue;
 		kfree(usb_get_serial_port_data(port));
 	}
 }

  reply	other threads:[~2007-03-21 21:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-21 21:29 2.6.21-rc4: NULL pointer dereference oops when unplugging sierra device Jeremy Fitzhardinge
2007-03-21 21:53 ` Greg KH [this message]
2007-03-21 22:14   ` Jeremy Fitzhardinge
2007-03-22  9:04   ` [linux-usb-devel] " Oliver Neukum

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070321215309.GA18940@suse.de \
    --to=gregkh@suse.de \
    --cc=jeremy@goop.org \
    --cc=johannes.hoelzl@gmx.de \
    --cc=klloyd@sierrawireless.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb-devel@lists.sourceforge.net \
    --cc=linux@sierrawireless.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.