diff --git a/usb/transfer_stream.go b/usb/transfer_stream.go index 8c79c5e..0190dc7 100644 --- a/usb/transfer_stream.go +++ b/usb/transfer_stream.go @@ -75,6 +75,9 @@ func (r ReadStream) Read(p []byte) (int, error) { if err != nil { // wait error aborts immediately, all remaining data is invalid. t.free() + if s.delayedErr == nil { + close(s.transfers) + } for t := range s.transfers { t.cancel() t.wait() diff --git a/usb/transfer_stream_test.go b/usb/transfer_stream_test.go index 352973e..31b2a1c 100644 --- a/usb/transfer_stream_test.go +++ b/usb/transfer_stream_test.go @@ -198,6 +198,18 @@ func TestReadStream(t *testing.T) { {err: io.ErrClosedPipe}, }, }, + { + desc: "fail quickly", + transfers: [][]fakeStreamResult{ + {{waitErr: sentinelError}}, + {{n: 500}}, + {{n: 500}}, + }, + want: []readRes{ + {err: sentinelError}, + {err: io.ErrClosedPipe}, + }, + }, } { t.Run(strconv.Itoa(tcNum), func(t *testing.T) { t.Logf("Case %d: %s", tcNum, tc.desc)