From 5f51814803d36f2201fa05b95975671aaf6bf7d7 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Fri, 2 Sep 2016 08:44:14 +0000 Subject: Fix array size issue when using the pre-scaling feature for ISOCHRONOUS USB transfers. Make sure enough length and buffer pointers are allocated when setting up the libusb transfer structure to support the maximum number of frames the kernel can handle. MFC after: 1 week --- lib/libusb/libusb20.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'lib/libusb/libusb20.c') diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c index 2f4ee780cabc..91ed9d797afd 100644 --- a/lib/libusb/libusb20.c +++ b/lib/libusb/libusb20.c @@ -176,6 +176,12 @@ libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize, return (LIBUSB20_ERROR_BUSY); if (MaxFrameCount & LIBUSB20_MAX_FRAME_PRE_SCALE) { MaxFrameCount &= ~LIBUSB20_MAX_FRAME_PRE_SCALE; + /* + * The kernel can setup 8 times more frames when + * pre-scaling ISOCHRONOUS transfers. Make sure the + * length and pointer buffers are big enough: + */ + MaxFrameCount *= 8; pre_scale = 1; } else { pre_scale = 0; @@ -200,8 +206,13 @@ libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize, } memset(xfer->ppBuffer, 0, size); - error = xfer->pdev->methods->tr_open(xfer, MaxBufSize, - MaxFrameCount, ep_no, stream_id, pre_scale); + if (pre_scale) { + error = xfer->pdev->methods->tr_open(xfer, MaxBufSize, + MaxFrameCount / 8, ep_no, stream_id, 1); + } else { + error = xfer->pdev->methods->tr_open(xfer, MaxBufSize, + MaxFrameCount, ep_no, stream_id, 0); + } if (error) { free(xfer->ppBuffer); -- cgit v1.2.3