ee67d4
diff -up ./src/ccid_usb.c.max_cpu_bug ./src/ccid_usb.c
ee67d4
--- ./src/ccid_usb.c.max_cpu_bug	2012-06-22 00:25:20.000000000 -0700
ee67d4
+++ ./src/ccid_usb.c	2016-06-29 17:17:11.284337349 -0700
ee67d4
@@ -154,6 +154,36 @@ status_t OpenUSB(unsigned int reader_ind
ee67d4
 } /* OpenUSB */
ee67d4
 
ee67d4
 
ee67d4
+ /*****************************************************************************
ee67d4
+  *
ee67d4
+  *                                      close_libusb_if_needed
ee67d4
+  *                                      (pulled from upstream ccid_usb)
ee67d4
+  *
ee67d4
+  ****************************************************************************/
ee67d4
+ static void close_libusb_if_needed(void)
ee67d4
+ {
ee67d4
+         int i, to_exit = TRUE;
ee67d4
+ 
ee67d4
+         if (NULL == ctx)
ee67d4
+                 return;
ee67d4
+ 
ee67d4
+         /* if at least 1 reader is still in use we do not exit libusb */
ee67d4
+         for (i=0; i
ee67d4
+         {
ee67d4
+                 if (usbDevice[i].dev_handle != NULL)
ee67d4
+                         to_exit = FALSE;
ee67d4
+         }
ee67d4
+ 
ee67d4
+         if (to_exit)
ee67d4
+         {
ee67d4
+                 DEBUG_INFO("libusb_exit");
ee67d4
+                 libusb_exit(ctx);
ee67d4
+                 ctx = NULL;
ee67d4
+         }
ee67d4
+} /* close_libusb_if_needed */
ee67d4
+ 
ee67d4
+
ee67d4
+
ee67d4
 /*****************************************************************************
ee67d4
  *
ee67d4
  *					OpenUSBByName
ee67d4
@@ -609,8 +639,8 @@ again:
ee67d4
 end:
ee67d4
 	if (usbDevice[reader_index].dev_handle == NULL)
ee67d4
 	{
ee67d4
-		/* does not work for libusb <= 1.0.8 */
ee67d4
-		/* libusb_exit(ctx); */
ee67d4
+	    close_libusb_if_needed();
ee67d4
+
ee67d4
 		if (claim_failed)
ee67d4
 			return STATUS_COMM_ERROR;
ee67d4
 		return STATUS_NO_SUCH_DEVICE;
ee67d4
@@ -628,6 +658,9 @@ end1:
ee67d4
 	/* free bundle list */
ee67d4
 	bundleRelease(&plist);
ee67d4
 
ee67d4
+	if (return_value != STATUS_SUCCESS)
ee67d4
+		close_libusb_if_needed();
ee67d4
+
ee67d4
 	return return_value;
ee67d4
 } /* OpenUSBByName */
ee67d4
 
ee67d4
@@ -776,13 +809,13 @@ status_t CloseUSB(unsigned int reader_in
ee67d4
 			usbDevice[reader_index].interface);
ee67d4
 		(void)libusb_close(usbDevice[reader_index].dev_handle);
ee67d4
 
ee67d4
-		/* does not work for libusb <= 1.0.8 */
ee67d4
-		/* libusb_exit(ctx); */
ee67d4
 	}
ee67d4
 
ee67d4
 	/* mark the resource unused */
ee67d4
 	usbDevice[reader_index].dev_handle = NULL;
ee67d4
 	usbDevice[reader_index].interface = 0;
ee67d4
+	
ee67d4
+	close_libusb_if_needed();
ee67d4
 
ee67d4
 	return STATUS_SUCCESS;
ee67d4
 } /* CloseUSB */