Skip to content

Commit

Permalink
usb: wusbcore: don't mark WA_SEG_DTI_PENDING segs as done in urb_dequeue
Browse files Browse the repository at this point in the history
Data for transfer segments in the WA_SEG_DTI_PENDING state is actively
being read by the driver.  Let the buffer read callback handle the
transfer cleanup since cleaning it up in wa_urb_dequeue will cause the
read callback to access invalid memory if the transfer is completed.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
TomServo3000 authored and gregkh committed Mar 7, 2014
1 parent 2a6da97 commit 5090ece
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion drivers/usb/wusbcore/wa-xfer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2005,6 +2005,16 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
case WA_SEG_DONE:
case WA_SEG_ERROR:
case WA_SEG_ABORTED:
break;
/*
* The buf_in data for a segment in the
* WA_SEG_DTI_PENDING state is actively being read.
* Let wa_buf_in_cb handle it since it will be called
* and will increment xfer->segs_done. Cleaning up
* here could cause wa_buf_in_cb to access the xfer
* after it has been completed/freed.
*/
case WA_SEG_DTI_PENDING:
break;
/*
* In the states below, the HWA device already knows
Expand All @@ -2015,7 +2025,6 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
*/
case WA_SEG_SUBMITTED:
case WA_SEG_PENDING:
case WA_SEG_DTI_PENDING:
/*
* Check if the abort was successfully sent. This could
* be false if the HWA has been removed but we haven't
Expand Down

0 comments on commit 5090ece

Please sign in to comment.