[Pcsclite-cvs-commit] r4585 - /trunk/PCSC/src/winscard_clnt.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Dec 3 09:15:34 UTC 2009


Author: rousseau
Date: Thu Dec  3 09:15:31 2009
New Revision: 4585

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4585
Log:
use the more efficient SCardCheckSameProcess() instead of
SCardCheckDaemonAvailability() to detect use of the API after a fork()

Modified:
    trunk/PCSC/src/winscard_clnt.c

Modified: trunk/PCSC/src/winscard_clnt.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_clnt.c?rev=4585&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_clnt.c (original)
+++ trunk/PCSC/src/winscard_clnt.c Thu Dec  3 09:15:31 2009
@@ -304,6 +304,7 @@
 static LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId,
 	LPBYTE pbAttr, LPDWORD pcbAttrLen);
 
+static LONG SCardCheckSameProcess(void);
 static LONG getReaderStates(SCONTEXTMAP * currentContextMap);
 
 /*
@@ -627,7 +628,7 @@
 		return SCARD_E_INVALID_HANDLE;
 	}
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 	{
 		/*
@@ -797,7 +798,7 @@
 	if (strlen(szReader) > MAX_READERNAME)
 		return SCARD_E_INVALID_VALUE;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -952,7 +953,7 @@
 	if (pdwActiveProtocol == NULL)
 		return SCARD_E_INVALID_PARAMETER;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1057,7 +1058,7 @@
 
 	PROFILE_START
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1165,7 +1166,7 @@
 
 	PROFILE_START
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1289,7 +1290,7 @@
 	 */
 	randnum = 0;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1370,7 +1371,7 @@
 
 	PROFILE_START
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1553,7 +1554,7 @@
 	*pcchReaderLen = 0;
 	*pcbAtrLen = 0;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1846,7 +1847,7 @@
 		/* reader list is empty */
 		return SCARD_S_SUCCESS;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -1892,7 +1893,7 @@
 	j = 0;
 	do
 	{
-		rv = SCardCheckDaemonAvailability();
+		rv = SCardCheckSameProcess();
 		if (rv != SCARD_S_SUCCESS)
 		{
 			if (currentContextMap->mMutex)
@@ -2347,7 +2348,7 @@
 	if (NULL != lpBytesReturned)
 		*lpBytesReturned = 0;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -2644,7 +2645,7 @@
 	SCONTEXTMAP * currentContextMap;
 	CHANNEL_MAP * pChannelMap;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -2804,7 +2805,7 @@
 			pcbRecvLength == NULL || pioSendPci == NULL)
 		return SCARD_E_INVALID_PARAMETER;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -2986,7 +2987,7 @@
 	if (pcchReaders == NULL)
 		return SCARD_E_INVALID_PARAMETER;
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -3102,7 +3103,7 @@
 
 	PROFILE_START
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -3182,7 +3183,7 @@
 	const char ReaderGroup[] = "SCard$DefaultReaders\0";
 	const int dwGroups = sizeof(ReaderGroup);
 
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -3361,7 +3362,7 @@
 	rv = SCARD_S_SUCCESS;
 
 	/* Check if the _same_ server is running */
-	rv = SCardCheckDaemonAvailability();
+	rv = SCardCheckSameProcess();
 	if (rv != SCARD_S_SUCCESS)
 		return rv;
 
@@ -3743,6 +3744,20 @@
 	return SCARD_S_SUCCESS;
 }
 
+static LONG SCardCheckSameProcess(void)
+{
+	/* after fork() need to restart */
+	if ((client_pid && client_pid != getpid()))
+	{
+		Log1(PCSC_LOG_INFO, "Client forked");
+		return SCardInvalidateHandles();
+	}
+
+	client_pid = getpid();
+
+	return SCARD_S_SUCCESS;
+}
+
 static LONG getReaderStates(SCONTEXTMAP * currentContextMap)
 {
 	int32_t dwClientID = currentContextMap->dwClientID;




More information about the Pcsclite-cvs-commit mailing list