Re: [OOPS] on usb removal, and minicom closing 2.6.11.7

From: Sergey Vlasov
Date: Thu Apr 14 2005 - 14:08:28 EST


On Thu, 14 Apr 2005 14:40:36 +0200 Grzegorz Piotr Jaskiewicz wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Works great, I would like to ask everyone here on lkml to consider
> adding this patch to mainline.
> This ain't naughty solution, checking for object/pointer/whatever if
> exists before doing anything with it, is good.

No, this patch is broken. It just avoids the problem in 99% of cases,
but it is not reliable. The real problem is that refcounting in cdc-acm
is broken, and the kernel is accessing freed memory.

The patches which really seem to fix the underlying problem can be found
in this thread:

http://thread.gmane.org/gmane.linux.usb.devel/32977

(see "[PATCH] N/3 cdc acm errors").

You also need this driver core fix:

http://thread.gmane.org/gmane.linux.usb.devel/33132


> Anyone?
>
> Buy the way, I am also looking for usblan for 2.6, can I use usbnet
> instead ? Anyone ported usblan to 2.6 (it's on GPL).
>
> JustMan wrote:
> >>So,
> >>
> >>I plugged in e680 motorola phone, played a bit with minicom on
> >>/dev/ttyACM0, and when I closed minicom, got this oops. USB is useless,
> >>got to reboot computer to use it again!
> >>it's vanilla 2.6.11.7
> >>
> >>oops attached.
> >>
> >
> >
> > Try attached patch... (nasty solution, but it work for my C350 motorola phone)
> >
> >
> >>
> >
> >
> > ------------------------------------------------------------------------
> >
> > diff -uNrp linux/drivers/base/class.orig.c linux/drivers/base/class.c
> > --- linux/drivers/base/class.orig.c 2005-03-10 12:19:00.000000000 +0300
> > +++ linux/drivers/base/class.c 2005-03-10 13:59:27.000000000 +0300
> > @@ -307,12 +307,14 @@ static int class_hotplug(struct kset *ks
> > if (class_dev->dev) {
> > /* add physical device, backing this device */
> > struct device *dev = class_dev->dev;
> > - char *path = kobject_get_path(&dev->kobj, GFP_KERNEL);
> >
> > - add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size,
> > - &length, "PHYSDEVPATH=%s", path);
> > - kfree(path);
> > + if(kobject_name(&dev->kobj)) {
> > + char *path = kobject_get_path(&dev->kobj, GFP_KERNEL);
> >
> > + add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size,
> > + &length, "PHYSDEVPATH=%s", path);
> > + kfree(path);
> > + }
> > /* add bus name of physical device */
> > if (dev->bus)
> > add_hotplug_env_var(envp, num_envp, &i,
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.0 (GNU/Linux)
>
> iD8DBQFCXmTEi0HtPCVkDAURAvIMAJ4+8tKj6jt/ErTtCrsmNYtM2aDfNACgigLA
> 4GbLbHStQJBq+Ez1lFe+lPo=
> =UWvD
> -----END PGP SIGNATURE-----

Attachment: pgp00000.pgp
Description: PGP signature