diff options
author | Artur Mądrzak <artur@madrzak.eu> | 2020-12-15 09:10:04 +0100 |
---|---|---|
committer | Artur Mądrzak <artur@madrzak.eu> | 2020-12-15 09:10:04 +0100 |
commit | faaa32999d56fd8253453d7e307cb6932b00145a (patch) | |
tree | 7a23640f62c63baf1729c34d311085eaaac05d8b | |
parent | b2e144519353602742585492aff84ea9562ae5a6 (diff) | |
download | libmtp-faaa32999d56fd8253453d7e307cb6932b00145a.tar.gz |
Fix data read for single usb packet
For device, that sends combined header and data in single usb packet
ptp_getdata function issue USB read request where there is no more data
to be read. This leads to raise IO error, as device doesn't send anymore
data because it's already finished transfer.
Signed-off-by: Artur Mądrzak <artur@madrzak.eu>
-rw-r--r-- | src/libopenusb1-glue.c | 4 | ||||
-rw-r--r-- | src/libusb-glue.c | 4 | ||||
-rw-r--r-- | src/libusb1-glue.c | 4 |
3 files changed, 12 insertions, 0 deletions
diff --git a/src/libopenusb1-glue.c b/src/libopenusb1-glue.c index 294c427..8dd9e06 100644 --- a/src/libopenusb1-glue.c +++ b/src/libopenusb1-glue.c @@ -1361,6 +1361,10 @@ ptp_usb_getdata(PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) { if (putfunc_ret != PTP_RC_OK) return putfunc_ret; + /* Nothing more left to read*/ + if (rlen == usbdata.length) + return PTP_RC_OK; + /* stuff data directly to passed data handler */ while (1) { unsigned long readdata; diff --git a/src/libusb-glue.c b/src/libusb-glue.c index 3c1b023..b770163 100644 --- a/src/libusb-glue.c +++ b/src/libusb-glue.c @@ -1349,6 +1349,10 @@ ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) if (putfunc_ret != PTP_RC_OK) return putfunc_ret; + /* Nothing more left to read*/ + if (rlen == usbdata.length) + return PTP_RC_OK; + /* stuff data directly to passed data handler */ while (1) { unsigned long readdata; diff --git a/src/libusb1-glue.c b/src/libusb1-glue.c index ffffa01..0992b2a 100644 --- a/src/libusb1-glue.c +++ b/src/libusb1-glue.c @@ -1453,6 +1453,10 @@ ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) if (putfunc_ret != PTP_RC_OK) return ptp_read_cancel_func(params, ptp->Transaction_ID); + /* Nothing more left to read*/ + if (rlen == usbdata.length) + return PTP_RC_OK; + /* stuff data directly to passed data handler */ while (1) { unsigned long readdata; |