Am Montag, 2. Juli 2012, 01:08:59 schrieb Bjørn Mork:
> The WDM_READ flag is normally cleared by wdm_int_callback
> before resubmitting the interrupt urb. But a crashing
> device may cause both a read error and cancelling all
> urbs. We must make sure that the flag is cleared by
> wdm_read in this case.
>
> Cc: <[email protected]>
> Signed-off-by: Bjørn Mork <[email protected]>
> ---
> drivers/usb/class/cdc-wdm.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
> index 25e7d72..f77a631 100644
> --- a/drivers/usb/class/cdc-wdm.c
> +++ b/drivers/usb/class/cdc-wdm.c
> @@ -461,6 +461,8 @@ retry:
> spin_lock_irq(&desc->iuspin);
>
> if (desc->rerr) { /* read completed, error happened */
> + dev_dbg(&desc->intf->dev, "%s: error - clearing
> WDM_READ\n", __func__);
> + clear_bit(WDM_READ, &desc->flags);
> desc->rerr = 0;
> spin_unlock_irq(&desc->iuspin);
> rv = -EIO;
> @@ -475,6 +477,8 @@ retry:
> goto retry;
> }
> if (!desc->reslength) { /* zero length read */
> + dev_dbg(&desc->intf->dev, "%s: zero length - clearing
> WDM_READ\n", __func__);
> + clear_bit(WDM_READ, &desc->flags);
> spin_unlock_irq(&desc->iuspin);
> goto retry;
> }
Are you sure that both patches are needed? After the first error is reported
we will return to user space and run into the reslength check at the next
call. If we cleared the flag unconditionally on reporting an error it seems
to me that we are introducing a data leak if a second read after the one
that produced the error has already completed.
Regards
Oliver
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html