[Pcsclite-cvs-commit] CVS Drivers/ccid/src

CVS User rousseau ludovic.rousseau@free.fr
Sun, 20 Feb 2005 07:34:43 -0700


Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory haydn:/tmp/cvs-serv15780

Modified Files:
	ccid_usb.c 
Log Message:
add an "interface field" in _usbDevice. This value is set in OpenUSB()
and used in CloseUSB().

The struct usb_device structure is half "corrupted" after the USB device
is removed and we wanted to use it when when closing the driver after a
reader removal. This caused a crash with libusb 0.1.10.


--- /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.c	2005/02/20 14:03:07	1.45
+++ /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.c	2005/02/20 14:34:42	1.46
@@ -18,7 +18,7 @@
 */
 
 /*
- * $Id: ccid_usb.c,v 1.45 2005/02/20 14:03:07 rousseau Exp $
+ * $Id: ccid_usb.c,v 1.46 2005/02/20 14:34:42 rousseau Exp $
  */
 
 #define __CCID_USB__
@@ -71,6 +71,7 @@
 {
 	usb_dev_handle *handle;
 	struct usb_device *dev;
+	int interface;
 
 	/*
 	 * Endpoints
@@ -386,6 +387,7 @@
 					/* store device information */
 					usbDevice[reader_index].handle = dev_handle;
 					usbDevice[reader_index].dev = dev;
+					usbDevice[reader_index].interface = interface;
 
 					/* CCID common informations */
 					usbDevice[reader_index].ccid.real_bSeq = 0;
@@ -498,9 +500,6 @@
  ****************************************************************************/
 status_t CloseUSB(unsigned int reader_index)
 {
-	struct usb_interface *usb_interface;
-	int interface;
-
 	/* device not opened */
 	if (usbDevice[reader_index].dev == NULL)
 		return STATUS_UNSUCCESSFUL;
@@ -509,20 +508,17 @@
 		usbDevice[reader_index].dev->bus->dirname,
 		usbDevice[reader_index].dev->filename);
 
-  	usb_interface = get_ccid_usb_interface(usbDevice[reader_index].dev);
-	interface = usb_interface ?
-		usb_interface->altsetting->bInterfaceNumber :
-		usbDevice[reader_index].dev->config->interface->altsetting->bInterfaceNumber;
-	
 	/* reset so that bSeq starts at 0 again */
 	usb_reset(usbDevice[reader_index].handle);
 
-	usb_release_interface(usbDevice[reader_index].handle, interface);
+	usb_release_interface(usbDevice[reader_index].handle,
+		usbDevice[reader_index].interface);
 	usb_close(usbDevice[reader_index].handle);
 
 	/* mark the resource unused */
 	usbDevice[reader_index].handle = NULL;
 	usbDevice[reader_index].dev = NULL;
+	usbDevice[reader_index].interface = 0;
 
 	return STATUS_SUCCESS;
 } /* CloseUSB */