Fix for mtp operation 18/143518/3 accepted/tizen/4.0/unified/20170828.222906 accepted/tizen/unified/20170816.160347 submit/tizen/20170816.074736 submit/tizen_4.0/20170828.100006
authorjh8801.jung <jh8801.jung@samsung.com>
Thu, 10 Aug 2017 07:46:08 +0000 (16:46 +0900)
committerjh8801.jung <jh8801.jung@samsung.com>
Wed, 16 Aug 2017 07:25:47 +0000 (16:25 +0900)
Signed-off-by: jh8801.jung <jh8801.jung@samsung.com>
Change-Id: I60f783b3820049a86012d15c7572146a12d5c975

packaging/libmtp.spec
src/libmtp.c
src/libmtp.h
src/libmtp.h.in
src/libusb1-glue.c
util/mtp-hotplug.c

index 3db74f0..df2a1e8 100755 (executable)
@@ -3,7 +3,7 @@
 Name:       libmtp
 Summary:    Library for media transfer protocol (mtp)
 Version:    1.1.11
-Release:    10
+Release:    11
 Group:      Network & Connectivity/Other
 License:    LGPL-2.1
 Source0:    libmtp-%{version}.tar.gz
@@ -56,7 +56,6 @@ rm -rf %{buildroot}
 %defattr(-,root,root,-)
 %{_libdir}/libmtp.so.*
 /lib/udev/rules.d/69-libmtp.rules
-/lib/udev/mtp-probe
 
 %files devel
 %defattr(-,root,root,-)
index 83e32c7..ae9c088 100755 (executable)
@@ -1811,10 +1811,12 @@ static void parse_extension_descriptor(LIBMTP_mtpdevice_t *mtpdevice,
            free(majorstr);
            free(minorstr);
             extension = malloc(sizeof(LIBMTP_device_extension_t));
-            extension->name = name;
-            extension->major = major;
-            extension->minor = minor;
-            extension->next = NULL;
+            if (extension != NULL) {
+              extension->name = name;
+              extension->major = major;
+              extension->minor = minor;
+              extension->next = NULL;
+            }
             if (mtpdevice->extensions == NULL) {
               mtpdevice->extensions = extension;
             } else {
@@ -2437,9 +2439,11 @@ static void add_error_to_errorstack(LIBMTP_mtpdevice_t *device,
     return;
   }
   newerror = (LIBMTP_error_t *) malloc(sizeof(LIBMTP_error_t));
-  newerror->errornumber = errornumber;
-  newerror->error_text = strdup(error_text);
-  newerror->next = NULL;
+  if (newerror != NULL) {
+    newerror->errornumber = errornumber;
+    newerror->error_text = strdup(error_text);
+    newerror->next = NULL;
+  }
   if (device->errorstack == NULL) {
     device->errorstack = newerror;
   } else {
@@ -2625,6 +2629,11 @@ static int get_all_metadata_fast(LIBMTP_mtpdevice_t *device)
   }
   lasthandle = 0xffffffff;
   params->objects = calloc (cnt, sizeof(PTPObject));
+  if (params->objects == NULL) {
+    free(props);
+    return -1;
+  }
+
   prop = props;
   i = -1;
   for (j=0;j<nrofprops;j++) {
@@ -3887,6 +3896,11 @@ static int get_device_unicode_property(LIBMTP_mtpdevice_t *device,
   // Extract the actual array.
   // printf("Array of %d elements\n", propval.a.count);
   tmp = malloc((propval.a.count + 1)*sizeof(uint16_t));
+  if (tmp == NULL) {
+    free(propval.a.v);
+    return -1;
+  }
+
   for (i = 0; i < propval.a.count; i++) {
     tmp[i] = propval.a.v[i].u16;
     // printf("%04x ", tmp[i]);
@@ -3956,6 +3970,9 @@ int LIBMTP_Get_Supported_Filetypes(LIBMTP_mtpdevice_t *device, uint16_t ** const
 
   // This is more memory than needed if there are unknown types, but what the heck.
   localtypes = (uint16_t *) malloc(params->deviceinfo.ImageFormats_len * sizeof(uint16_t));
+  if (localtypes == NULL)
+    return -1;
+
   localtypelen = 0;
 
   for (i=0;i<params->deviceinfo.ImageFormats_len;i++) {
@@ -3969,6 +3986,9 @@ int LIBMTP_Get_Supported_Filetypes(LIBMTP_mtpdevice_t *device, uint16_t ** const
   if (FLAG_OGG_IS_UNKNOWN(ptp_usb)) {
     localtypes = (uint16_t *) realloc(localtypes,
                (params->deviceinfo.ImageFormats_len+1) * sizeof(uint16_t));
+    if (localtypes == NULL)
+      return -1;
+
     localtypes[localtypelen] = LIBMTP_FILETYPE_OGG;
     localtypelen++;
   }
@@ -3976,6 +3996,9 @@ int LIBMTP_Get_Supported_Filetypes(LIBMTP_mtpdevice_t *device, uint16_t ** const
   if (FLAG_FLAC_IS_UNKNOWN(ptp_usb)) {
     localtypes = (uint16_t *) realloc(localtypes,
                (params->deviceinfo.ImageFormats_len+1) * sizeof(uint16_t));
+    if (localtypes == NULL)
+      return -1;
+
     localtypes[localtypelen] = LIBMTP_FILETYPE_FLAC;
     localtypelen++;
   }
@@ -4074,6 +4097,8 @@ int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *device, int const sortby)
 
       storage = (LIBMTP_devicestorage_t *)
        malloc(sizeof(LIBMTP_devicestorage_t));
+      if (storage == NULL)
+        return -1;
       storage->prev = storageprev;
       if (storageprev != NULL)
         storageprev->next = storage;
@@ -4110,6 +4135,8 @@ int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *device, int const sortby)
 
       storage = (LIBMTP_devicestorage_t *)
        malloc(sizeof(LIBMTP_devicestorage_t));
+      if (storage == NULL)
+        return -1;
       storage->prev = storageprev;
       if (storageprev != NULL)
         storageprev->next = storage;
@@ -7355,6 +7382,8 @@ uint32_t LIBMTP_Create_Folder(LIBMTP_mtpdevice_t *device, char *name,
   if (!(params->device_flags & DEVICE_FLAG_BROKEN_SEND_OBJECT_PROPLIST) &&
        ptp_operation_issupported(params,PTP_OC_MTP_SendObjectPropList)) {
        MTPProperties *props = (MTPProperties*)calloc(2,sizeof(MTPProperties));
+   if (props == NULL)
+     return -1;
 
        props[0].property = PTP_OPC_ObjectFileName;
        props[0].datatype = PTP_DTC_STR;
@@ -8978,6 +9007,12 @@ int LIBMTP_Get_Thumbnail_From_Exif_Data(LIBMTP_mtpdevice_t *device, uint32_t con
   unsigned char *app1_marker = NULL;
   ExifData *exif_data = NULL;
 
+  PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo;
+
+  int oldtimeout;
+
+  get_usb_device_timeout(ptp_usb, &oldtimeout);
+
   if (!ptp_operation_issupported(params, PTP_OC_GetPartialObject)) {
     LIBMTP_INFO("ptp_operation_issupported fail - id %d", id);
     return -1;
@@ -8999,12 +9034,17 @@ int LIBMTP_Get_Thumbnail_From_Exif_Data(LIBMTP_mtpdevice_t *device, uint32_t con
   }
 
   //Get App1 Marker header
+  set_usb_device_timeout(ptp_usb, 3000);
+
   ret = ptp_getpartialobject (params, id, 0, 10, &jpeg_header, &jpeg_header_size);
   if (ret != PTP_RC_OK) {
     LIBMTP_INFO("first ptp_getpartialobject fail - id %d", id);
+    set_usb_device_timeout(ptp_usb, oldtimeout);
     return -5;
   }
 
+  set_usb_device_timeout(ptp_usb, oldtimeout);
+
   if (!((jpeg_header[0] == 0xff) && (jpeg_header[1] == 0xd8))) {    /* 0XFF 0xD8 means SOI (Start Of Image) */
     LIBMTP_INFO("SOI fail - id %d", id);
     free(jpeg_header);
@@ -9032,12 +9072,17 @@ int LIBMTP_Get_Thumbnail_From_Exif_Data(LIBMTP_mtpdevice_t *device, uint32_t con
   LIBMTP_INFO("maxbytes is %d", maxbytes);
 
   //Get App1 Marker : EXIF Data
+  set_usb_device_timeout(ptp_usb, 3000);
+
   ret = ptp_getpartialobject (params, id, offset, maxbytes, &app1_marker, &app1_marker_size);
   if (ret != PTP_RC_OK) {
     LIBMTP_INFO("second ptp_getpartialobject fail - id %d", id);
+    set_usb_device_timeout(ptp_usb, oldtimeout);
     return -9;
   }
 
+  set_usb_device_timeout(ptp_usb, oldtimeout);
+
   if (app1_marker == NULL) {
     LIBMTP_INFO("app1_marker is NULL - id %d", id);
     return -10;
@@ -9295,6 +9340,10 @@ int LIBMTP_Get_Object_Handles(LIBMTP_mtpdevice_t *device, uint32_t storage,
        }
 
        *object_list = (uint32_t *)malloc(currentHandles.n * sizeof(int));
+       if (*object_list == NULL) {
+               LIBMTP_INFO("object list is NULL");
+               return -4;
+       }
 
        for (i = 0; i < currentHandles.n; i++) {
                if(_is_exist_handler(object_list, temp, currentHandles.Handler[i]))
@@ -9328,6 +9377,8 @@ MTPObjectInfo *LIBMTP_Get_Object_Info(LIBMTP_mtpdevice_t *device, uint32_t objec
        }
 
        object_info = (MTPObjectInfo *)malloc(sizeof(MTPObjectInfo));
+       if (object_info == NULL)
+               return NULL;
 
        ret = ptp_object_want(params, object_id, PTPOBJECT_OBJECTINFO_LOADED, &ob);
 
index 1a05aa1..65f324b 100755 (executable)
@@ -537,6 +537,7 @@ struct LIBMTP_raw_device_struct {
   LIBMTP_device_entry_t device_entry; /**< The device entry for this raw device */
   uint32_t bus_location; /**< Location of the bus, if device available */
   uint8_t devnum; /**< Device number on the bus, if device available */
+  uint8_t portnum; /**< Port number on the bus, if device available */
 };
 
 /**
index 024fce9..c880765 100755 (executable)
@@ -537,6 +537,7 @@ struct LIBMTP_raw_device_struct {
   LIBMTP_device_entry_t device_entry; /**< The device entry for this raw device */
   uint32_t bus_location; /**< Location of the bus, if device available */
   uint8_t devnum; /**< Device number on the bus, if device available */
+  uint8_t portnum; /**< Port number on the bus, if device available */
 };
 
 /**
index fb0113d..51732a5 100755 (executable)
@@ -713,6 +713,7 @@ LIBMTP_error_number_t LIBMTP_Detect_Raw_Devices(LIBMTP_raw_device_t ** devices,
     // Save the location on the bus
     retdevs[i].bus_location = libusb_get_bus_number (dev->device);
     retdevs[i].devnum = libusb_get_device_address (dev->device);
+    retdevs[i].portnum = libusb_get_port_number (dev->device);
     i++;
     dev = dev->next;
   }
@@ -1153,9 +1154,11 @@ ptp_init_recv_memory_handler(PTPDataHandler *handler) {
        handler->priv = priv;
        handler->getfunc = memory_getfunc;
        handler->putfunc = memory_putfunc;
-       priv->data = NULL;
-       priv->size = 0;
-       priv->curoff = 0;
+       if (priv != NULL) {
+               priv->data = NULL;
+               priv->size = 0;
+               priv->curoff = 0;
+       }
        return PTP_RC_OK;
 }
 
index 8e118ae..bf72e49 100755 (executable)
@@ -273,11 +273,19 @@ int main (int argc, char **argv)
      * This is code that invokes the mtp-probe program on
      * every USB device that is either PTP or vendor specific
      */
+
+    /*
+     * [DF170329-01096] Tizen TV can't running the auto probe because suspend issue.
+     */
+
+    /*
     printf("\n# Autoprobe vendor-specific, communication and PTP devices\n");
     printf("ENV{ID_MTP_DEVICE}!=\"1\", ENV{MTP_NO_PROBE}!=\"1\", ENV{COLOR_MEASUREMENT_DEVICE}!=\"1\", ENV{libsane_matched}!=\"yes\", ATTR{bDeviceClass}==\"00|02|06|ef|ff\", PROGRAM=\"%smtp-probe /sys$env{DEVPATH} $attr{busnum} $attr{devnum}\", RESULT==\"1\", %s", mtp_probe_dir, action);
     if (udev_group != NULL) printf(", GROUP=\"%s\"", udev_group);
     if (udev_mode != NULL) printf(", MODE=\"%s\"", udev_mode);
     printf("\n");
+     */
+
    printf("\nLABEL=\"libmtp_rules_end\"\n");
     break;
   case style_hal: