usbfs: Allow printer class 'get_device_id' without needing to claim the intf
authorHans de Goede <hdegoede@redhat.com>
Fri, 12 Jul 2013 08:04:18 +0000 (10:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jul 2013 19:01:12 +0000 (12:01 -0700)
For certain (HP) printers the printer device_id does not only contain a
static part identifying the printer, but it also contains a dynamic part
giving printer status, ink level, etc.

To get to this info various userspace utilities need to be able to make a
printer class 'get_device_id' request without first claiming the interface
(as that is in use for the actual printer driver).

Since the printer class 'get_device_id' request does not change interface
settings in anyway, allowing this without claiming the interface should not
cause any issues.

CC: Sanjay Kumar <sanjay.kumar14@hp.com>
CC: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/devio.c

index 05986507b585897c763ac58e067e8a25f7e75374..737e3c19967bee3e81f57cc041ec9989ec38fb57 100644 (file)
@@ -725,15 +725,15 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype,
 
        /*
         * check for the special corner case 'get_device_id' in the printer
-        * class specification, where wIndex is (interface << 8 | altsetting)
-        * instead of just interface
+        * class specification, which we always want to allow as it is used
+        * to query things like ink level, etc.
         */
        if (requesttype == 0xa1 && request == 0) {
                alt_setting = usb_find_alt_setting(ps->dev->actconfig,
                                                   index >> 8, index & 0xff);
                if (alt_setting
                 && alt_setting->desc.bInterfaceClass == USB_CLASS_PRINTER)
-                       index >>= 8;
+                       return 0;
        }
 
        index &= 0xff;