[Pcsclite-cvs-commit] r3354 - /trunk/Drivers/ccid/src/commands.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Fri Mar 20 16:10:31 UTC 2009


Author: rousseau
Date: Fri Mar 20 16:10:31 2009
New Revision: 3354

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=3354
Log:
CmdEscape(): set the communication timeout to 30 seconds for the
PC_to_RDR_Escape commands since some commands may be slow

Thanks to Adam Laurie (rfidiot.org) for the bug report

Modified:
    trunk/Drivers/ccid/src/commands.c

Modified: trunk/Drivers/ccid/src/commands.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/commands.c?rev=3354&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/commands.c (original)
+++ trunk/Drivers/ccid/src/commands.c Fri Mar 20 16:10:31 2009
@@ -671,19 +671,27 @@
 	status_t res;
 	unsigned int length_in, length_out;
 	RESPONSECODE return_value = IFD_SUCCESS;
+	int old_read_timeout;
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
+
+	old_read_timeout = ccid_descriptor -> readTimeout;
+	ccid_descriptor -> readTimeout = 30;	/* 30 seconds */
 
 again:
 	/* allocate buffers */
 	length_in = 10 + TxLength;
 	if (NULL == (cmd_in = malloc(length_in)))
-		return IFD_COMMUNICATION_ERROR;
+	{
+		return_value = IFD_COMMUNICATION_ERROR;
+		goto end;
+	}
 
 	length_out = 10 + *RxLength;
 	if (NULL == (cmd_out = malloc(length_out)))
 	{
 		free(cmd_in);
-		return IFD_COMMUNICATION_ERROR;
+		return_value = IFD_COMMUNICATION_ERROR;
+		goto end;
 	}
 
 	cmd_in[0] = 0x6B; /* PC_to_RDR_Escape */
@@ -700,7 +708,8 @@
 	if (res != STATUS_SUCCESS)
 	{
 		free(cmd_out);
-		return IFD_COMMUNICATION_ERROR;
+		return_value = IFD_COMMUNICATION_ERROR;
+		goto end;
 	}
 
 	res = ReadPort(reader_index, &length_out, cmd_out);
@@ -718,13 +727,15 @@
 	if (res != STATUS_SUCCESS)
 	{
 		free(cmd_out);
-		return IFD_COMMUNICATION_ERROR;
+		return_value = IFD_COMMUNICATION_ERROR;
+		goto end;
 	}
 
 	if (length_out < STATUS_OFFSET+1)
 	{
 		DEBUG_CRITICAL2("Not enough data received: %d bytes", length_out);
-		return IFD_COMMUNICATION_ERROR;
+		return_value = IFD_COMMUNICATION_ERROR;
+		goto end;
 	}
 
 	if (cmd_out[STATUS_OFFSET] & CCID_COMMAND_FAILED)
@@ -742,6 +753,8 @@
 
 	free(cmd_out);
 
+end:
+	ccid_descriptor -> readTimeout = old_read_timeout;
 	return return_value;
 } /* Escape */
 




More information about the Pcsclite-cvs-commit mailing list