[Pcsclite-cvs-commit] PCSC/src readerfactory.c,1.44,1.45

rousseau@haydn.debian.org rousseau@haydn.debian.org


Update of /cvsroot/pcsclite/PCSC/src
In directory haydn:/tmp/cvs-serv15616

Modified Files:
	readerfactory.c 
Log Message:
- rename dwFeeds and dwMutex to pdwFeeds and pdwMutex since they are
  pointers
- add a check to avoid removing an aleady removed driver (closes bug
  [ #300684 ] pcscd segfaults on 'if (*sContext->dwMutex == 1)')


Index: readerfactory.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/readerfactory.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- readerfactory.c	21 Apr 2004 21:42:33 -0000	1.44
+++ readerfactory.c	3 May 2004 13:54:23 -0000	1.45
@@ -143,7 +143,7 @@
 	(sReadersContexts[dwContext])->dwLockId = 0;
 	(sReadersContexts[dwContext])->vHandle = 0;
 	(sReadersContexts[dwContext])->dwPublicID = 0;
-	(sReadersContexts[dwContext])->dwFeeds = 0;
+	(sReadersContexts[dwContext])->pdwFeeds = 0;
 	(sReadersContexts[dwContext])->dwIdentity =
 		(dwContext + 1) << (sizeof(DWORD) / 2) * 8;
 
@@ -155,15 +155,15 @@
 	 */
 	if (parentNode >= 0 && parentNode < PCSCLITE_MAX_READERS_CONTEXTS)
 	{
-		(sReadersContexts[dwContext])->dwFeeds = 
-		  (sReadersContexts[parentNode])->dwFeeds;
-		*(sReadersContexts[dwContext])->dwFeeds += 1;
+		(sReadersContexts[dwContext])->pdwFeeds = 
+		  (sReadersContexts[parentNode])->pdwFeeds;
+		*(sReadersContexts[dwContext])->pdwFeeds += 1;
 		(sReadersContexts[dwContext])->vHandle = 
 		  (sReadersContexts[parentNode])->vHandle;
 		(sReadersContexts[dwContext])->mMutex = 
 		  (sReadersContexts[parentNode])->mMutex;
-		(sReadersContexts[dwContext])->dwMutex = 
-		  (sReadersContexts[parentNode])->dwMutex;
+		(sReadersContexts[dwContext])->pdwMutex = 
+		  (sReadersContexts[parentNode])->pdwMutex;
 
 		/*
 		 * Call on the driver to see if it is thread safe 
@@ -176,23 +176,23 @@
 		{
 			DebugLogA("Driver is thread safe");
 			(sReadersContexts[dwContext])->mMutex = 0;
-			(sReadersContexts[dwContext])->dwMutex = 0;
+			(sReadersContexts[dwContext])->pdwMutex = 0;
 		}
 		else
-			*(sReadersContexts[dwContext])->dwMutex += 1;
+			*(sReadersContexts[dwContext])->pdwMutex += 1;
 	}
 
-	if ((sReadersContexts[dwContext])->dwFeeds == 0)
+	if ((sReadersContexts[dwContext])->pdwFeeds == 0)
 	{
-		(sReadersContexts[dwContext])->dwFeeds = 
+		(sReadersContexts[dwContext])->pdwFeeds = 
 		  (DWORD *)malloc(sizeof(DWORD));
 
-		/* Initialize dwFeeds to 1, otherwise multiple 
+		/* Initialize pdwFeeds to 1, otherwise multiple 
 		   cloned readers will cause pcscd to crash when 
 		   RFUnloadReader unloads the driver library
 		   and there are still devices attached using it --mikeg*/
 
-		*(sReadersContexts[dwContext])->dwFeeds = 1;
+		*(sReadersContexts[dwContext])->pdwFeeds = 1;
 	}
 
 	if ((sReadersContexts[dwContext])->mMutex == 0)
@@ -202,12 +202,12 @@
 		SYS_MutexInit((sReadersContexts[dwContext])->mMutex);
 	}
 
-	if ((sReadersContexts[dwContext])->dwMutex == 0)
+	if ((sReadersContexts[dwContext])->pdwMutex == 0)
 	{
-		(sReadersContexts[dwContext])->dwMutex = 
+		(sReadersContexts[dwContext])->pdwMutex = 
 		  (DWORD *)malloc(sizeof(DWORD));
 
-		*(sReadersContexts[dwContext])->dwMutex = 1;
+		*(sReadersContexts[dwContext])->pdwMutex = 1;
 	}
 
 	dwNumReadersContexts += 1;
@@ -232,26 +232,26 @@
 		/*
 		 * Destroy and free the mutex 
 		 */
-		if (*(sReadersContexts[dwContext])->dwMutex == 1)
+		if (*(sReadersContexts[dwContext])->pdwMutex == 1)
 		{
 			SYS_MutexDestroy((sReadersContexts[dwContext])->mMutex);
 			free((sReadersContexts[dwContext])->mMutex);
 		}
 
-		*(sReadersContexts[dwContext])->dwMutex -= 1;
+		*(sReadersContexts[dwContext])->pdwMutex -= 1;
 
-		if (*(sReadersContexts[dwContext])->dwMutex == 0)
+		if (*(sReadersContexts[dwContext])->pdwMutex == 0)
 		{
-			free((sReadersContexts[dwContext])->dwMutex);
-			(sReadersContexts[dwContext])->dwMutex = 0;
+			free((sReadersContexts[dwContext])->pdwMutex);
+			(sReadersContexts[dwContext])->pdwMutex = 0;
 		}
 
-		*(sReadersContexts[dwContext])->dwFeeds -= 1;
+		*(sReadersContexts[dwContext])->pdwFeeds -= 1;
 
-		if (*(sReadersContexts[dwContext])->dwFeeds == 0)
+		if (*(sReadersContexts[dwContext])->pdwFeeds == 0)
 		{
-			free((sReadersContexts[dwContext])->dwFeeds);
-			(sReadersContexts[dwContext])->dwFeeds = 0;
+			free((sReadersContexts[dwContext])->pdwFeeds);
+			(sReadersContexts[dwContext])->pdwFeeds = 0;
 		}
 
 		dwNumReadersContexts -= 1;
@@ -333,19 +333,19 @@
 		  (sReadersContexts[dwContext])->vHandle;
 		(sReadersContexts[dwContextB])->mMutex =
 		   (sReadersContexts[dwContext])->mMutex;
-		(sReadersContexts[dwContextB])->dwMutex =
-		   (sReadersContexts[dwContext])->dwMutex;
+		(sReadersContexts[dwContextB])->pdwMutex =
+		   (sReadersContexts[dwContext])->pdwMutex;
 
 		/* 
-		 * Added by Dave - slots did not have a dwFeeds
+		 * Added by Dave - slots did not have a pdwFeeds
 		 * parameter so it was by luck they were working
 		 */
 
-		(sReadersContexts[dwContextB])->dwFeeds =
-		  (sReadersContexts[dwContext])->dwFeeds;
+		(sReadersContexts[dwContextB])->pdwFeeds =
+		  (sReadersContexts[dwContext])->pdwFeeds;
 
 		/* Added by Dave for multiple slots */
-		*(sReadersContexts[dwContextB])->dwFeeds += 1;
+		*(sReadersContexts[dwContextB])->pdwFeeds += 1;
 
 		(sReadersContexts[dwContextB])->dwStatus = 0;
 		(sReadersContexts[dwContextB])->dwBlockStatus = 0;
@@ -372,12 +372,12 @@
 				(PCSCLITE_MUTEX_T) malloc(sizeof(PCSCLITE_MUTEX));
 			SYS_MutexInit((sReadersContexts[dwContextB])->mMutex);
 
-			(sReadersContexts[dwContextB])->dwMutex = 
+			(sReadersContexts[dwContextB])->pdwMutex = 
 				(DWORD *)malloc(sizeof(DWORD));
-			*(sReadersContexts[dwContextB])->dwMutex = 1;
+			*(sReadersContexts[dwContextB])->pdwMutex = 1;
 		}
 		else
-			*(sReadersContexts[dwContextB])->dwMutex += 1;
+			*(sReadersContexts[dwContextB])->pdwMutex += 1;
 
 		dwNumReadersContexts += 1;
 
@@ -402,26 +402,26 @@
 			/*
 			 * Destroy and free the mutex 
 			 */
-			if (*(sReadersContexts[dwContextB])->dwMutex == 1)
+			if (*(sReadersContexts[dwContextB])->pdwMutex == 1)
 			{
 				SYS_MutexDestroy((sReadersContexts[dwContextB])->mMutex);
 				free((sReadersContexts[dwContextB])->mMutex);
 			}
 
-			*(sReadersContexts[dwContextB])->dwMutex -= 1;
+			*(sReadersContexts[dwContextB])->pdwMutex -= 1;
 
-			if (*(sReadersContexts[dwContextB])->dwMutex == 0)
+			if (*(sReadersContexts[dwContextB])->pdwMutex == 0)
 			{
-				free((sReadersContexts[dwContextB])->dwMutex);
-				(sReadersContexts[dwContextB])->dwMutex = 0;
+				free((sReadersContexts[dwContextB])->pdwMutex);
+				(sReadersContexts[dwContextB])->pdwMutex = 0;
 			}
 
-			*(sReadersContexts[dwContextB])->dwFeeds -= 1;
+			*(sReadersContexts[dwContextB])->pdwFeeds -= 1;
 
-			if (*(sReadersContexts[dwContextB])->dwFeeds == 0)
+			if (*(sReadersContexts[dwContextB])->pdwFeeds == 0)
 			{
-				free((sReadersContexts[dwContextB])->dwFeeds);
-				(sReadersContexts[dwContextB])->dwFeeds = 0;
+				free((sReadersContexts[dwContextB])->pdwFeeds);
+				(sReadersContexts[dwContextB])->pdwFeeds = 0;
 			}
 
 			dwNumReadersContexts -= 1;
@@ -465,28 +465,34 @@
 		/*
 		 * Destroy and free the mutex 
 		 */
-		if (*sContext->dwMutex == 1)
+		if ((NULL == sContext->pdwMutex) || (NULL == sContext->pdwFeeds))
+		{
+			DebugLogA("Trying to remove an already removed driver");
+			return SCARD_E_INVALID_VALUE;
+		}
+
+		if (*sContext->pdwMutex == 1)
 		{
 			SYS_MutexDestroy(sContext->mMutex);
 			free(sContext->mMutex);
 		}
 
-		*sContext->dwMutex -= 1;
+		*sContext->pdwMutex -= 1;
 
-		if (*sContext->dwMutex == 0)
+		if (*sContext->pdwMutex == 0)
 		{
-			free(sContext->dwMutex);
-			sContext->dwMutex = 0;
+			free(sContext->pdwMutex);
+			sContext->pdwMutex = NULL;
 		}
 
-		*sContext->dwFeeds -= 1;
+		*sContext->pdwFeeds -= 1;
 
-		/* Added by Dave to free the dwFeeds variable */
+		/* Added by Dave to free the pdwFeeds variable */
 
-		if (*sContext->dwFeeds == 0)
+		if (*sContext->pdwFeeds == 0)
 		{
-			free(sContext->dwFeeds);
-			sContext->dwFeeds = 0;
+			free(sContext->pdwFeeds);
+			sContext->pdwFeeds = NULL;
 		}
 
 		sContext->lpcDevice[0] = 0;
@@ -1195,7 +1201,7 @@
 	 * Make sure no one else is using this library 
 	 */
 
-	if (*rContext->dwFeeds == 1)
+	if (*rContext->pdwFeeds == 1)
 	{
 		DebugLogA("Unloading reader driver.");
 		DYN_CloseLibrary(&rContext->vHandle);