[Pcsclite-cvs-commit] r5129 - /trunk/PCSC/src/winscard_svc.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Fri Aug 13 13:18:53 UTC 2010


Author: rousseau
Date: Fri Aug 13 13:18:48 2010
New Revision: 5129

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5129
Log:
ContextThread(): goto exit if MSGCheckHandleAssociation() fails instead
of just returning no error.

Something wrong happened on the client side (like a fork) and the client
needs to call SCardEstablishContext() to create a new connection.

Modified:
    trunk/PCSC/src/winscard_svc.c

Modified: trunk/PCSC/src/winscard_svc.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_svc.c?rev=5129&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_svc.c (original)
+++ trunk/PCSC/src/winscard_svc.c Fri Aug 13 13:18:48 2010
@@ -470,19 +470,17 @@
 			case SCARD_DISCONNECT:
 			{
 				struct disconnect_struct diStr;
-				LONG rv;
 
 				READ_BODY(diStr)
 
-				rv = MSGCheckHandleAssociation(diStr.hCard, threadContext);
-				if (0 == rv)
-				{
-					diStr.rv = SCardDisconnect(diStr.hCard, diStr.dwDisposition);
-
-					if (SCARD_S_SUCCESS == diStr.rv)
-						diStr.rv =
-							MSGRemoveHandle(diStr.hCard, threadContext);
-				}
+				if (MSGCheckHandleAssociation(diStr.hCard, threadContext))
+					goto exit;
+
+				diStr.rv = SCardDisconnect(diStr.hCard, diStr.dwDisposition);
+
+				if (SCARD_S_SUCCESS == diStr.rv)
+					diStr.rv =
+						MSGRemoveHandle(diStr.hCard, threadContext);
 
 				WRITE_BODY(diStr)
 			}
@@ -491,13 +489,13 @@
 			case SCARD_BEGIN_TRANSACTION:
 			{
 				struct begin_struct beStr;
-				LONG rv;
 
 				READ_BODY(beStr)
 
-				rv = MSGCheckHandleAssociation(beStr.hCard, threadContext);
-				if (0 == rv)
-					beStr.rv = SCardBeginTransaction(beStr.hCard);
+				if (MSGCheckHandleAssociation(beStr.hCard, threadContext))
+					goto exit;
+
+				beStr.rv = SCardBeginTransaction(beStr.hCard);
 
 				WRITE_BODY(beStr)
 			}
@@ -506,14 +504,13 @@
 			case SCARD_END_TRANSACTION:
 			{
 				struct end_struct enStr;
-				LONG rv;
 
 				READ_BODY(enStr)
 
-				rv = MSGCheckHandleAssociation(enStr.hCard, threadContext);
-				if (0 == rv)
-					enStr.rv =
-						SCardEndTransaction(enStr.hCard, enStr.dwDisposition);
+				if (MSGCheckHandleAssociation(enStr.hCard, threadContext))
+					goto exit;
+
+				enStr.rv = SCardEndTransaction(enStr.hCard, enStr.dwDisposition);
 
 				WRITE_BODY(enStr)
 			}
@@ -522,13 +519,13 @@
 			case SCARD_CANCEL_TRANSACTION:
 			{
 				struct cancel_transaction_struct caStr;
-				LONG rv;
 
 				READ_BODY(caStr)
 
-				rv = MSGCheckHandleAssociation(caStr.hCard, threadContext);
-				if (0 == rv)
-					caStr.rv = SCardCancelTransaction(caStr.hCard);
+				if (MSGCheckHandleAssociation(caStr.hCard, threadContext))
+					goto exit;
+
+				caStr.rv = SCardCancelTransaction(caStr.hCard);
 
 				WRITE_BODY(caStr)
 			}
@@ -560,41 +557,37 @@
 			case SCARD_STATUS:
 			{
 				struct status_struct stStr;
-				LONG rv;
+				DWORD cchReaderLen;
+				DWORD dwState;
+				DWORD dwProtocol;
+				DWORD cbAtrLen;
 
 				READ_BODY(stStr)
 
-				rv = MSGCheckHandleAssociation(stStr.hCard, threadContext);
-				if (0 == rv)
+				if (MSGCheckHandleAssociation(stStr.hCard, threadContext))
+					goto exit;
+
+				cchReaderLen = stStr.pcchReaderLen;
+				dwState = stStr.dwState;
+				dwProtocol = stStr.dwProtocol;
+				cbAtrLen = stStr.pcbAtrLen;
+
+				/* avoids buffer overflow */
+				if ((cchReaderLen > sizeof(stStr.mszReaderNames))
+					|| (cbAtrLen > sizeof(stStr.pbAtr)))
 				{
-					DWORD cchReaderLen;
-					DWORD dwState;
-					DWORD dwProtocol;
-					DWORD cbAtrLen;
-
-					cchReaderLen = stStr.pcchReaderLen;
-					dwState = stStr.dwState;
-					dwProtocol = stStr.dwProtocol;
-					cbAtrLen = stStr.pcbAtrLen;
-
-					/* avoids buffer overflow */
-					if ((cchReaderLen > sizeof(stStr.mszReaderNames))
-						|| (cbAtrLen > sizeof(stStr.pbAtr)))
-					{
-						stStr.rv = SCARD_E_INSUFFICIENT_BUFFER ;
-					}
-					else
-					{
-						stStr.rv = SCardStatus(stStr.hCard,
-							stStr.mszReaderNames,
-							&cchReaderLen, &dwState,
-							&dwProtocol, stStr.pbAtr, &cbAtrLen);
-
-						stStr.pcchReaderLen = cchReaderLen;
-						stStr.dwState = dwState;
-						stStr.dwProtocol = dwProtocol;
-						stStr.pcbAtrLen = cbAtrLen;
-					}
+					stStr.rv = SCARD_E_INSUFFICIENT_BUFFER ;
+				}
+				else
+				{
+					stStr.rv = SCardStatus(stStr.hCard,
+						stStr.mszReaderNames, &cchReaderLen, &dwState,
+						&dwProtocol, stStr.pbAtr, &cbAtrLen);
+
+					stStr.pcchReaderLen = cchReaderLen;
+					stStr.dwState = dwState;
+					stStr.dwProtocol = dwProtocol;
+					stStr.pcbAtrLen = cbAtrLen;
 				}
 
 				WRITE_BODY(stStr)




More information about the Pcsclite-cvs-commit mailing list