Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: src/libusb1-glue.c

Issue 12041060: libmtp: Fix some leaks in common code paths. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libmtp/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/libmtp.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * \file libusb1-glue.c 2 * \file libusb1-glue.c
3 * Low-level USB interface glue towards libusb. 3 * Low-level USB interface glue towards libusb.
4 * 4 *
5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com> 5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com>
6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se> 6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se>
7 * Copyright (C) 2006-2012 Marcus Meissner 7 * Copyright (C) 2006-2012 Marcus Meissner
8 * Copyright (C) 2007 Ted Bullock 8 * Copyright (C) 2007 Ted Bullock
9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com> 9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com>
10 * 10 *
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 else { 534 else {
535 // Check whether the device is no USB hub but a PTP. 535 // Check whether the device is no USB hub but a PTP.
536 if ( dev->config != NULL &&dev->config->interface->altsetting->bInte rfaceClass == LIBUSB_CLASS_PTP && dev->descriptor.bDeviceClass != LIBUSB_CLASS_H UB ) { 536 if ( dev->config != NULL &&dev->config->interface->altsetting->bInte rfaceClass == LIBUSB_CLASS_PTP && dev->descriptor.bDeviceClass != LIBUSB_CLASS_H UB ) {
537 *mtp_device_list = append_to_mtpdevice_list(*mtp_device_list, dev, bus->location); 537 *mtp_device_list = append_to_mtpdevice_list(*mtp_device_list, dev, bus->location);
538 } 538 }
539 } 539 }
540 */ 540 */
541 } 541 }
542 } 542 }
543 } 543 }
544 libusb_free_device_list (devs, 0);
544 545
545 /* If nothing was found we end up here. */ 546 /* If nothing was found we end up here. */
546 if(*mtp_device_list == NULL) { 547 if(*mtp_device_list == NULL) {
547 return LIBMTP_ERROR_NO_DEVICE_ATTACHED; 548 return LIBMTP_ERROR_NO_DEVICE_ATTACHED;
548 } 549 }
549 return LIBMTP_ERROR_NONE; 550 return LIBMTP_ERROR_NONE;
550 } 551 }
551 552
552 /** 553 /**
553 * Checks if a specific device with a certain bus and device 554 * Checks if a specific device with a certain bus and device
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 towrite = size-curwrite; 963 towrite = size-curwrite;
963 if (towrite > CONTEXT_BLOCK_SIZE) { 964 if (towrite > CONTEXT_BLOCK_SIZE) {
964 towrite = CONTEXT_BLOCK_SIZE; 965 towrite = CONTEXT_BLOCK_SIZE;
965 } else { 966 } else {
966 // This magic makes packets the same size that WMP send them. 967 // This magic makes packets the same size that WMP send them.
967 if (towrite > ptp_usb->outep_maxpacket && towrite % ptp_usb->outep_maxpack et != 0) { 968 if (towrite > ptp_usb->outep_maxpacket && towrite % ptp_usb->outep_maxpack et != 0) {
968 towrite -= towrite % ptp_usb->outep_maxpacket; 969 towrite -= towrite % ptp_usb->outep_maxpacket;
969 } 970 }
970 } 971 }
971 int getfunc_ret = handler->getfunc(NULL, handler->priv,towrite,bytes,&towrit e); 972 int getfunc_ret = handler->getfunc(NULL, handler->priv,towrite,bytes,&towrit e);
972 if (getfunc_ret != PTP_RC_OK) 973 if (getfunc_ret != PTP_RC_OK) {
974 free(bytes);
973 return getfunc_ret; 975 return getfunc_ret;
976 }
974 while (usbwritten < towrite) { 977 while (usbwritten < towrite) {
975 ret = USB_BULK_WRITE(ptp_usb->handle, 978 ret = USB_BULK_WRITE(ptp_usb->handle,
976 ptp_usb->outep, 979 ptp_usb->outep,
977 bytes+usbwritten, 980 bytes+usbwritten,
978 towrite-usbwritten, 981 towrite-usbwritten,
979 &xwritten, 982 &xwritten,
980 ptp_usb->timeout); 983 ptp_usb->timeout);
981 984
982 LIBMTP_USB_DEBUG("USB OUT==>\n"); 985 LIBMTP_USB_DEBUG("USB OUT==>\n");
983 986
984 if (ret != LIBUSB_SUCCESS) { 987 if (ret != LIBUSB_SUCCESS) {
988 free(bytes);
985 return PTP_ERROR_IO; 989 return PTP_ERROR_IO;
986 } 990 }
987 LIBMTP_USB_DATA(bytes+usbwritten, xwritten, 16); 991 LIBMTP_USB_DATA(bytes+usbwritten, xwritten, 16);
988 // check for result == 0 perhaps too. 992 // check for result == 0 perhaps too.
989 // Increase counters 993 // Increase counters
990 ptp_usb->current_transfer_complete += xwritten; 994 ptp_usb->current_transfer_complete += xwritten;
991 curwrite += xwritten; 995 curwrite += xwritten;
992 usbwritten += xwritten; 996 usbwritten += xwritten;
993 } 997 }
994 // call callback 998 // call callback
995 if (ptp_usb->callback_active) { 999 if (ptp_usb->callback_active) {
996 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total) { 1000 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total) {
997 // send last update and disable callback. 1001 // send last update and disable callback.
998 ptp_usb->current_transfer_complete = ptp_usb->current_transfer_total; 1002 ptp_usb->current_transfer_complete = ptp_usb->current_transfer_total;
999 ptp_usb->callback_active = 0; 1003 ptp_usb->callback_active = 0;
1000 } 1004 }
1001 if (ptp_usb->current_transfer_callback != NULL) { 1005 if (ptp_usb->current_transfer_callback != NULL) {
1002 int ret; 1006 int ret;
1003 ret = ptp_usb->current_transfer_callback(ptp_usb->current_transfer_compl ete, 1007 ret = ptp_usb->current_transfer_callback(ptp_usb->current_transfer_compl ete,
1004 ptp_usb->current_transfer_total , 1008 ptp_usb->current_transfer_total ,
1005 ptp_usb->current_transfer_callb ack_data); 1009 ptp_usb->current_transfer_callb ack_data);
1006 if (ret != 0) { 1010 if (ret != 0) {
1011 free(bytes);
1007 return PTP_ERROR_CANCEL; 1012 return PTP_ERROR_CANCEL;
1008 } 1013 }
1009 } 1014 }
1010 } 1015 }
1011 if (xwritten < towrite) /* short writes happen */ 1016 if (xwritten < towrite) /* short writes happen */
1012 break; 1017 break;
1013 } 1018 }
1014 free (bytes); 1019 free (bytes);
1015 if (written) { 1020 if (written) {
1016 *written = curwrite; 1021 *written = curwrite;
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of device\n "); 2034 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of device\n ");
2030 return LIBMTP_ERROR_CONNECTING; 2035 return LIBMTP_ERROR_CONNECTING;
2031 } 2036 }
2032 2037
2033 /* Copy USB version number */ 2038 /* Copy USB version number */
2034 ptp_usb->bcdusb = desc.bcdUSB; 2039 ptp_usb->bcdusb = desc.bcdUSB;
2035 2040
2036 /* Attempt to initialize this device */ 2041 /* Attempt to initialize this device */
2037 if (init_ptp_usb(params, ptp_usb, ldevice) < 0) { 2042 if (init_ptp_usb(params, ptp_usb, ldevice) < 0) {
2038 LIBMTP_ERROR("LIBMTP PANIC: Unable to initialize device\n"); 2043 LIBMTP_ERROR("LIBMTP PANIC: Unable to initialize device\n");
2044 libusb_free_device_list (devs, 0);
2039 return LIBMTP_ERROR_CONNECTING; 2045 return LIBMTP_ERROR_CONNECTING;
2040 } 2046 }
2041 2047
2042 /* 2048 /*
2043 * This works in situations where previous bad applications 2049 * This works in situations where previous bad applications
2044 * have not used LIBMTP_Release_Device on exit 2050 * have not used LIBMTP_Release_Device on exit
2045 */ 2051 */
2046 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { 2052 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) {
2047 LIBMTP_ERROR("PTP_ERROR_IO: failed to open session, trying again after reset ting USB interface\n"); 2053 LIBMTP_ERROR("PTP_ERROR_IO: failed to open session, trying again after reset ting USB interface\n");
2048 LIBMTP_ERROR("LIBMTP libusb: Attempt to reset device\n"); 2054 LIBMTP_ERROR("LIBMTP libusb: Attempt to reset device\n");
2049 libusb_reset_device (ptp_usb->handle); 2055 libusb_reset_device (ptp_usb->handle);
2050 close_usb(ptp_usb); 2056 close_usb(ptp_usb);
2051 2057
2052 if(init_ptp_usb(params, ptp_usb, ldevice) <0) { 2058 if(init_ptp_usb(params, ptp_usb, ldevice) <0) {
2053 LIBMTP_ERROR("LIBMTP PANIC: Could not init USB on second attempt\n"); 2059 LIBMTP_ERROR("LIBMTP PANIC: Could not init USB on second attempt\n");
2060 libusb_free_device_list (devs, 0);
2054 return LIBMTP_ERROR_CONNECTING; 2061 return LIBMTP_ERROR_CONNECTING;
2055 } 2062 }
2056 2063
2057 /* Device has been reset, try again */ 2064 /* Device has been reset, try again */
2058 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { 2065 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) {
2059 LIBMTP_ERROR("LIBMTP PANIC: failed to open session on second attempt\n"); 2066 LIBMTP_ERROR("LIBMTP PANIC: failed to open session on second attempt\n");
2067 libusb_free_device_list (devs, 0);
2060 return LIBMTP_ERROR_CONNECTING; 2068 return LIBMTP_ERROR_CONNECTING;
2061 } 2069 }
2062 } 2070 }
2063 2071
2064 /* Was the transaction id invalid? Try again */ 2072 /* Was the transaction id invalid? Try again */
2065 if (ret == PTP_RC_InvalidTransactionID) { 2073 if (ret == PTP_RC_InvalidTransactionID) {
2066 LIBMTP_ERROR("LIBMTP WARNING: Transaction ID was invalid, increment and try again\n"); 2074 LIBMTP_ERROR("LIBMTP WARNING: Transaction ID was invalid, increment and try again\n");
2067 params->transaction_id += 10; 2075 params->transaction_id += 10;
2068 ret = ptp_opensession(params, 1); 2076 ret = ptp_opensession(params, 1);
2069 } 2077 }
2070 2078
2071 if (ret != PTP_RC_SessionAlreadyOpened && ret != PTP_RC_OK) { 2079 if (ret != PTP_RC_SessionAlreadyOpened && ret != PTP_RC_OK) {
2072 LIBMTP_ERROR("LIBMTP PANIC: Could not open session! " 2080 LIBMTP_ERROR("LIBMTP PANIC: Could not open session! "
2073 "(Return code %d)\n Try to reset the device.\n", 2081 "(Return code %d)\n Try to reset the device.\n",
2074 ret); 2082 ret);
2075 libusb_release_interface(ptp_usb->handle, ptp_usb->interface); 2083 libusb_release_interface(ptp_usb->handle, ptp_usb->interface);
2084 libusb_free_device_list (devs, 0);
2076 return LIBMTP_ERROR_CONNECTING; 2085 return LIBMTP_ERROR_CONNECTING;
2077 } 2086 }
2078 2087
2079 /* OK configured properly */ 2088 /* OK configured properly */
2080 *usbinfo = (void *) ptp_usb; 2089 *usbinfo = (void *) ptp_usb;
2090 libusb_free_device_list (devs, 0);
2081 return LIBMTP_ERROR_NONE; 2091 return LIBMTP_ERROR_NONE;
2082 } 2092 }
2083 2093
2084 2094
2085 void close_device (PTP_USB *ptp_usb, PTPParams *params) 2095 void close_device (PTP_USB *ptp_usb, PTPParams *params)
2086 { 2096 {
2087 if (ptp_closesession(params)!=PTP_RC_OK) 2097 if (ptp_closesession(params)!=PTP_RC_OK)
2088 LIBMTP_ERROR("ERROR: Could not close session!\n"); 2098 LIBMTP_ERROR("ERROR: Could not close session!\n");
2089 close_usb(ptp_usb); 2099 close_usb(ptp_usb);
2090 } 2100 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2132 { 2142 {
2133 return libusb_control_transfer(ptp_usb->handle, 2143 return libusb_control_transfer(ptp_usb->handle,
2134 LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_ENDPOINT, 2144 LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_ENDPOINT,
2135 LIBUSB_REQUEST_GET_STATUS, 2145 LIBUSB_REQUEST_GET_STATUS,
2136 USB_FEATURE_HALT, 2146 USB_FEATURE_HALT,
2137 ep, 2147 ep,
2138 (unsigned char *) status, 2148 (unsigned char *) status,
2139 2, 2149 2,
2140 ptp_usb->timeout); 2150 ptp_usb->timeout);
2141 } 2151 }
OLDNEW
« no previous file with comments | « src/libmtp.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698