From 60a4de0090ace53e77fc8071bb5a088d46293d39 Mon Sep 17 00:00:00 2001 From: Jihoon Jung Date: Tue, 15 Nov 2016 11:11:27 +0900 Subject: [PATCH] Minor patch in libmtp - Modify Get partial object function - Fix for overflow issue - Add log Change-Id: Id6a3915b708c5ade534b7938328e1d53cdc931fd --- packaging/libmtp.spec | 2 +- src/libmtp.c | 50 ++++++++++++++++++++++++++------------------------ src/libmtp.h | 2 +- src/libmtp.h.in | 2 +- src/libusb1-glue.c | 14 +++++++++++++- 5 files changed, 42 insertions(+), 28 deletions(-) diff --git a/packaging/libmtp.spec b/packaging/libmtp.spec index 118d1a5..cb25aec 100755 --- a/packaging/libmtp.spec +++ b/packaging/libmtp.spec @@ -3,7 +3,7 @@ Name: libmtp Summary: Library for media transfer protocol (mtp) Version: 1.1.11 -Release: 1 +Release: 2 Group: Network & Connectivity/Other License: LGPL-2.1 Source0: libmtp-%{version}.tar.gz diff --git a/src/libmtp.c b/src/libmtp.c index 28249e1..cf34a72 100755 --- a/src/libmtp.c +++ b/src/libmtp.c @@ -3143,33 +3143,33 @@ void LIBMTP_Dump_Device_Info(LIBMTP_mtpdevice_t *device) tmpext->minor); tmpext = tmpext->next; } - printf("Supported operations:\n"); + LIBMTP_INFO("Supported operations:"); for (i=0;ideviceinfo.OperationsSupported_len;i++) { char txt[256]; (void) ptp_render_opcode(params, params->deviceinfo.OperationsSupported[i], sizeof(txt), txt); - printf(" %04x: %s\n", params->deviceinfo.OperationsSupported[i], txt); + LIBMTP_INFO(" %04x: %s", params->deviceinfo.OperationsSupported[i], txt); } - printf("Events supported:\n"); + LIBMTP_INFO("Events supported:\n"); if (params->deviceinfo.EventsSupported_len == 0) { - printf(" None.\n"); + LIBMTP_INFO(" None.\n"); } else { for (i=0;ideviceinfo.EventsSupported_len;i++) { - printf(" 0x%04x\n", params->deviceinfo.EventsSupported[i]); + LIBMTP_INFO(" 0x%04x\n", params->deviceinfo.EventsSupported[i]); } } - printf("Device Properties Supported:\n"); + LIBMTP_INFO("Device Properties Supported:\n"); for (i=0;ideviceinfo.DevicePropertiesSupported_len;i++) { char const *propdesc = ptp_get_property_description(params, params->deviceinfo.DevicePropertiesSupported[i]); if (propdesc != NULL) { - printf(" 0x%04x: %s\n", + LIBMTP_INFO(" 0x%04x: %s\n", params->deviceinfo.DevicePropertiesSupported[i], propdesc); } else { uint16_t prop = params->deviceinfo.DevicePropertiesSupported[i]; - printf(" 0x%04x: Unknown property\n", prop); + LIBMTP_INFO(" 0x%04x: Unknown property\n", prop); } } @@ -9066,32 +9066,34 @@ int LIBMTP_Get_Thumbnail_From_Exif_Data(LIBMTP_mtpdevice_t *device, uint32_t con #endif /* TIZEN_EXT */ int LIBMTP_GetPartialObject(LIBMTP_mtpdevice_t *device, uint32_t const id, - uint64_t offset, uint32_t maxbytes, + uint32_t offset, uint32_t maxbytes, unsigned char **data, unsigned int *size) { PTPParams *params = (PTPParams *) device->params; uint16_t ret; + PTPObject *ob; - if (!ptp_operation_issupported(params, PTP_OC_ANDROID_GetPartialObject64)) { - if (!ptp_operation_issupported(params, PTP_OC_GetPartialObject)) { - add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, - "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject not supported"); - return -1; - } + if (!ptp_operation_issupported(params, PTP_OC_GetPartialObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject not supported"); + return -1; + } - if (offset >> 32 != 0) { - add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, - "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject only supports 32bit offsets"); - return -1; - } + if (ptp_object_want(params, id, PTPOBJECT_OBJECTINFO_LOADED, &ob) != PTP_RC_OK) { + LIBMTP_INFO("ptp_object_want fail - id %d", id); + return -2; + } - ret = ptp_getpartialobject(params, id, (uint32_t)offset, maxbytes, data, size); - } else { - ret = ptp_android_getpartialobject64(params, id, offset, maxbytes, data, size); + if (offset >> 32 != 0) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject only supports 32bit offsets"); + return -3; } + + ret = ptp_getpartialobject(params, id, offset, maxbytes, data, size); if (ret == PTP_RC_OK) return 0; - return -1; + return ret; } diff --git a/src/libmtp.h b/src/libmtp.h index 704c050..1a05aa1 100755 --- a/src/libmtp.h +++ b/src/libmtp.h @@ -1079,7 +1079,7 @@ int LIBMTP_Set_Album_Name(LIBMTP_mtpdevice_t *, LIBMTP_album_t *, const char *); int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t); int LIBMTP_Set_Object_Filename(LIBMTP_mtpdevice_t *, uint32_t , char *); int LIBMTP_GetPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, - uint64_t, uint32_t, + uint32_t, uint32_t, unsigned char **, unsigned int *); int LIBMTP_SendPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, uint64_t, unsigned char *, unsigned int); diff --git a/src/libmtp.h.in b/src/libmtp.h.in index d10a624..024fce9 100755 --- a/src/libmtp.h.in +++ b/src/libmtp.h.in @@ -1079,7 +1079,7 @@ int LIBMTP_Set_Album_Name(LIBMTP_mtpdevice_t *, LIBMTP_album_t *, const char *); int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t); int LIBMTP_Set_Object_Filename(LIBMTP_mtpdevice_t *, uint32_t , char *); int LIBMTP_GetPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, - uint64_t, uint32_t, + uint32_t, uint32_t, unsigned char **, unsigned int *); int LIBMTP_SendPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, uint64_t, unsigned char *, unsigned int); diff --git a/src/libusb1-glue.c b/src/libusb1-glue.c index ef13f03..c39603f 100755 --- a/src/libusb1-glue.c +++ b/src/libusb1-glue.c @@ -905,12 +905,24 @@ ptp_read_func ( LIBMTP_USB_DEBUG("Reading in 0x%04lx bytes\n", toread); - ret = USB_BULK_READ(ptp_usb->handle, + if (ptp_usb->params != NULL && + ptp_usb->params->deviceinfo.Model != NULL && + !strcmp(ptp_usb->params->deviceinfo.Model, "SM-C200")) { + ret = USB_BULK_READ(ptp_usb->handle, + ptp_usb->inep, + bytes, + CONTEXT_BLOCK_SIZE, + &xread, + ptp_usb->timeout); + } + else { + ret = USB_BULK_READ(ptp_usb->handle, ptp_usb->inep, bytes, toread, &xread, ptp_usb->timeout); + } LIBMTP_USB_DEBUG("Result of read: 0x%04x (%d bytes)\n", ret, xread); -- 2.7.4