[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