usb: wusbcore: prevent urb dequeue and giveback race
authorThomas Pugliese <thomas.pugliese@gmail.com>
Fri, 28 Feb 2014 20:31:57 +0000 (14:31 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Mar 2014 00:13:09 +0000 (16:13 -0800)
commit5da43afc2b73795e82c4bc3e53a4a177a02637d0
tree049941c751b72206569d778bf468336599f83cd8
parentacfadcea2adaa52048c6b3c8a3c75105a5540707
usb: wusbcore: prevent urb dequeue and giveback race

This patch takes a reference to the wa_xfer object in wa_urb_dequeue to
prevent the urb giveback code from completing the xfer and freeing it
while wa_urb_dequeue is executing.  It also checks for done at the start
to avoid a double completion scenario.  Adding the check for done in
urb_dequeue means that any other place where a submitted transfer
segment is marked as done must complete the transfer if it is done.
__wa_xfer_delayed_run was not checking this case so that check was added
as well.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/wa-xfer.c