summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtur Mądrzak <artur@madrzak.eu>2020-12-15 09:10:04 +0100
committerArtur Mądrzak <artur@madrzak.eu>2020-12-15 09:10:04 +0100
commitfaaa32999d56fd8253453d7e307cb6932b00145a (patch)
tree7a23640f62c63baf1729c34d311085eaaac05d8b
parentb2e144519353602742585492aff84ea9562ae5a6 (diff)
downloadlibmtp-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.c4
-rw-r--r--src/libusb-glue.c4
-rw-r--r--src/libusb1-glue.c4
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;