Hi,

On Mon, Feb 03, 2003 at 06:04:03PM -0800, Greg KH wrote:
> > Also you seem to have applied the maintainer change (scanner.h +
> > scanner.c) only for 2.4 and not for 2.5? 
> > 
> > While I'm talking about scanner.h: Is the separated include file for
> > the ioctls also necessary in 2.5?
> 
> I don't think so, you will be deleting the scanner driver in 2.5 soon,
> right?  :)

The only thing that stops me from removing it yet is that I don't know
what to do with interrupt endpoints. It's rumored that some scanners
only work when the interrupt endpoints are used but I don't have
details. I don't think that's possible with userspace drivers that
access /proc/bus/usb/XXX/YYY? The scanner driver provides just a dummy
for them currently, but I guess that could be changed.

> > What about the fix for crashes when someone writes to a disconnected
> > scanner? Are there fundamental problems with the patch or should I
> > just resend it?
> 
> I don't know, I didn't like the patch the last time I saw it.  How about
> a 2.5 version first?

The latest version of this patch was for 2.5 and you didn't comment on
that one. That's why I ask :-)

I'll attach a rediffed version to this mail.

Bye,
  Henning
  
------------------------------snip -------------------------------

This is another try to fix the crashes that occur when a USB scanner
is disconnected while open and write/read/ioctl is called after the
disconnect. This time I've kept all the cleanup bur kfree(scn) in
disconnect_scanner() and only the kfree(scn) is done in close_scanner,
if the device was disconnected in the meantime.

That one (close_scanner()) looks a bit funny:

if (scn->present) {
        up(&(scn->sem));
} else {
        up(&(scn->sem));
        kfree (scn);
}

But if I up the semaphore before the test for scn->present, I guess
that would be a race with disconnect_scanner.

Bye,
  Henning
  
[PATCH 2.5.59] USB scanner.c: Avoid crashes when using read/write/ioctl on 
disconnected device

Avoid crashing when read/write/ioctl is called after disconnecting the
device. Keep scn until the device is closed and check scn->present in
read/write/ioctl. 

--- linux-2.5.59-newids4/drivers/usb/image/scanner.c    2003-01-20 21:15:24.000000000 
+0100
+++ linux-2.5.59-nocrash2/drivers/usb/image/scanner.c   2003-02-04 10:32:41.000000000 
++0100
@@ -345,7 +345,10 @@
  *    - New maintainer: Henning Meier-Geinitz.
  *    - Print ids and device number when a device was detected.
  *    - Don't print errors when the device is busy.
- *      
+ *    - Avoid crashing when read/write/ioctl is called after disconnecting the
+ *      device. Keep scn until the device is closed and check scn->present in
+ *      read/write/ioctl.
+ *
  * TODO
  *    - Performance
  *    - Select/poll methods
@@ -514,7 +517,12 @@
        file->private_data = NULL;
 
        up(&scn_mutex);
-       up(&(scn->sem));
+       if (scn->present) {
+               up(&(scn->sem));
+       } else {
+               up(&(scn->sem));
+               kfree (scn);
+       }
 
        return 0;
 }
@@ -541,6 +549,12 @@
 
        down(&(scn->sem));
 
+       if (!scn->present) {
+               /* Disconnected */
+               up(&(scn->sem));
+               return -EINVAL;
+       }
+
        if (!scn->bulk_out_ep) {
                /* This scanner does not have a bulk-out endpoint */
                up(&(scn->sem));
@@ -634,6 +648,12 @@
 
        down(&(scn->sem));
 
+       if (!scn->present) {
+               /* Disconnected */
+               up(&(scn->sem));
+               return -EINVAL;
+       }
+
        scn_minor = scn->scn_minor;
 
        ibuf = scn->ibuf;
@@ -742,6 +762,12 @@
        scn_minor = USB_SCN_MINOR(inode);
        down(&(scn->sem));
 
+       if (!scn->present) {
+               /* Disconnected */
+               up(&(scn->sem));
+               return -EINVAL;
+       }
+
        dev = scn->scn_dev;
 
        switch (cmd)
@@ -1102,8 +1128,13 @@
                devfs_unregister(scn->devfs);
                usb_deregister_dev(1, scn->scn_minor);
                usb_free_urb(scn->scn_irq);
-               up (&(scn->sem));
-               kfree (scn);
+               if (scn->isopen) {
+                       scn->present = 0;
+                       up (&(scn->sem));
+               } else {
+                       up (&(scn->sem));
+                       kfree (scn);
+               }
                up (&scn_mutex);
        }
 }



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to