Greg KH <[EMAIL PROTECTED]> writes:
> On Fri, Jan 04, 2002 at 12:38:36AM +0100, Peter Osterlund wrote:
> >
> > When trying to write to a bad CDRW disk in my USB CDRW unit, I got an
> > oops in the usb subsystem. The oops was caused by passing junk to
> > kfree in usb_destroy_configuration, line 1765. The as->extra field
> > apparently contained junk.
>
> First off, the usb-storage driver doesn't seem to work properly in
> 2.5.2-pre6 due to the bio and scsi changes happening. Have you got it
> to work?
Yes, it does work with the patch I sent previously. The only problem
is that my patch will stop working again sometime in the future, when
the .address field is removed from struct scatterlist.
> > I think this is caused by a race in usb_parse_interface.
> > interface->num_altsetting is incremented before the corresponding
> > altsetting[] data has been initialized. If an interrupt occurs in
> > between, and the interrupt causes the device to be removed, bad things
> > will happen.
>
> I don't see how that can happen, as this code only runs when the device
> is first plugged in (from what I can tell.) usb_destroy_configuration()
> seems to be called much later. Can you enable debugging in the
> usb-storage driver and see if that shows anything?
I think my device rapidly disappeared/reappeared and disappeared again
on the bus, but I don't know for sure, because I didn't have serial
console logging active at the time, and I can not repeat the problem.
Anyway, if (header->bLength < 2) is true in usb_parse_interface (line
1546), the endpoint, extra and extralen fields will never be
initialized. This will lead to either corruption or a memory leak when
usb_destroy_configuration is called. Therefore I think this patch is
correct.
--- usb.c.old Fri Jan 4 11:56:20 2002
+++ usb.c Fri Jan 4 14:58:18 2002
@@ -1527,6 +1527,9 @@
}
ifp = interface->altsetting + interface->num_altsetting;
+ ifp->endpoint = NULL;
+ ifp->extra = NULL;
+ ifp->extralen = 0;
interface->num_altsetting++;
memcpy(ifp, buffer, USB_DT_INTERFACE_SIZE);
Also, while analyzing this problem, I found a bug in usb-uhci.c. If
the uhci_start_usb call fails in alloc_uhci, line 3004,
uhci_pci_remove will oops, because the pci private data has not been
initialized, so uhci_t *s will be zero, and s->bus will oops. Here is
a patch to fix this bug:
--- usb-uhci.c.old Fri Jan 4 14:06:48 2002
+++ usb-uhci.c Fri Jan 4 14:21:01 2002
@@ -3000,13 +3000,13 @@
s->irq = irq;
+ pci_set_drvdata(dev, s);
if(uhci_start_usb (s) < 0) {
uhci_pci_remove(dev);
return -1;
}
//chain new uhci device into global list
- pci_set_drvdata(dev, s);
devs=s;
return 0;
--
Peter Osterlund - [EMAIL PROTECTED]
http://w1.894.telia.com/~u89404340
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel