[PATCH] base/class.c: prevent ooops due to insert/remove race (v3)
Mark Lord <[email protected]>
| Newsgroups | gmane.linux.usb.devel,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Mark Lord wrote: > Mark Lord wrote: >> Mark Lord wrote: >> ... >> And here is a "prevented" oops, courtesy of the patch (2.6.23.8). >> These are easy to reproduce (just jiggle the connection on an >> attached USB multi-card reader with a CF card inserted): > ... >> [ 347.099562] usb 5-6: USB disconnect, address 10 >> [ 347.101077] BUG: unable to handle kernel NULL pointer dereference >> at virtual address 00000000 > > ... > > > Mmmm.. that's odd. It *did* Oops there. I wonder how/why ? ... Ahh.. it was the *other* call to strlen() that was crapping out. Here's an updated patch to prevent the Oops: * * * * While doing insert/remove (quickly) tests on USB, I managed to trigger an Oops on 2.6.23.8 on a call to strlen() in make_class_name(). USB maintainers can try this themselves, by plugging in an external USB XX-in-1 flash reader, with a CF card inserted. Then just jiggle the connection so that the device connects and disconnects rapidly. This may not sound realistic, but there's definitely a race in there, and this is a quick way to reproduce it if need be. The patch below prevents the oops, but still keeps the bug visible. Signed-off-by: Mark Lord <[email protected]> --- Patch applies to both 2.6.24 and 2.6.23. --- old/drivers/base/class.c 2007-11-29 10:51:43.000000000 -0500 +++ linux/drivers/base/class.c 2007-11-29 13:00:15.000000000 -0500 @@ -352,9 +352,22 @@ char *make_class_name(const char *name, struct kobject *kobj) { char *class_name; + const char *kname; int size; - size = strlen(name) + strlen(kobject_name(kobj)) + 2; + /* Rapidly inserting/removing a USB device (others?) + * can trigger an Oops on the strlen() call. + * Cause unknown yet, so prevent the Oops + * but don't mask the issue. + */ + kname = kobject_name(kobj); + if (!kname || !name) { + printk(KERN_ERR "make_class_name: name=%p kname=%p\n", + name, kname); + BUG_ON(1); + return NULL; + } + size = strlen(name) + strlen(kname) + 2; class_name = kmalloc(size, GFP_KERNEL); if (!class_name) ------------------------------------------------------------------------- SF.Net email is sponsored by: The Future of Linux Business White Paper from Novell. From the desktop to the data center, Linux is going mainstream. Let it simplify your IT future. http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4 _______________________________________________ [email protected] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel