Blame SOURCES/coolkey-thread-fix.patch

d98f6e
Index: src/coolkey/coolkey.cpp
d98f6e
===================================================================
d98f6e
RCS file: /cvs/dirsec/coolkey/src/coolkey/coolkey.cpp,v
d98f6e
retrieving revision 1.2
d98f6e
diff -u -r1.2 coolkey.cpp
d98f6e
--- src/coolkey/coolkey.cpp	14 Feb 2007 19:54:01 -0000	1.2
d98f6e
+++ src/coolkey/coolkey.cpp	18 Dec 2009 23:22:58 -0000
d98f6e
@@ -42,7 +42,9 @@
d98f6e
 
d98f6e
 static SlotList *slotList = NULL;
d98f6e
 
d98f6e
-static OSLock finalizeLock(false);
d98f6e
+static OSLock *finalizeLock = NULL;
d98f6e
+#define FINALIZE_GETLOCK() if (finalizeLock) finalizeLock->getLock();
d98f6e
+#define FINALIZE_RELEASELOCK() if (finalizeLock) finalizeLock->releaseLock();
d98f6e
 
d98f6e
 static CK_BBOOL initialized = FALSE;
d98f6e
 static CK_BBOOL finalizing = FALSE;
d98f6e
@@ -208,11 +210,13 @@
d98f6e
     if( initialized ) {
d98f6e
         return CKR_CRYPTOKI_ALREADY_INITIALIZED;
d98f6e
     }
d98f6e
-    if (!finalizeLock.isValid()) {
d98f6e
+    if (finalizeLock && !finalizeLock->isValid()) {
d98f6e
 	return CKR_CANT_LOCK;
d98f6e
     }
d98f6e
     CK_C_INITIALIZE_ARGS* initArgs = (CK_C_INITIALIZE_ARGS*) pInitArgs;
d98f6e
+    OSLock::setThreadSafe(0);
d98f6e
     if( initArgs != NULL ) {
d98f6e
+	bool needThreads;
d98f6e
 	/* work around a bug in NSS where the library parameters are only
d98f6e
 	 * send if locking is requested */
d98f6e
 	if (initArgs->LibraryParameters) {
d98f6e
@@ -220,7 +224,17 @@
d98f6e
 	} else {
d98f6e
 	    Params::ClearParams();
d98f6e
 	}
d98f6e
-        if( (initArgs->flags & CKF_OS_LOCKING_OK) || initArgs->LockMutex ){
d98f6e
+  	needThreads = ((initArgs->flags & CKF_OS_LOCKING_OK) != 0);
d98f6e
+	OSLock::setThreadSafe(needThreads);
d98f6e
+	/* don't get a finalize lock unless someone initializes us asking
d98f6e
+	 * us to use threads */
d98f6e
+	if (needThreads && !finalizeLock) {
d98f6e
+	    finalizeLock = new OSLock(true);
d98f6e
+	    if (finalizeLock == NULL) return CKR_HOST_MEMORY;
d98f6e
+	}
d98f6e
+	/* only support OS LOCKING threads */
d98f6e
+        if( ((initArgs->flags & CKF_OS_LOCKING_OK) == 0) 
d98f6e
+						&& initArgs->LockMutex ){
d98f6e
             throw PKCS11Exception(CKR_CANT_LOCK);
d98f6e
         }
d98f6e
     }
d98f6e
@@ -259,9 +273,9 @@
d98f6e
     // the finalizing call first, we know it will set waitEvent before
d98f6e
     // we can get the lock, so we only need to protect setting finalizing
d98f6e
     // to true.
d98f6e
-    finalizeLock.getLock();
d98f6e
+    FINALIZE_GETLOCK();
d98f6e
     finalizing = TRUE;
d98f6e
-    finalizeLock.releaseLock();
d98f6e
+    FINALIZE_RELEASELOCK();
d98f6e
     if (waitEvent) {
d98f6e
 	/* we're waiting on a slot event, shutdown first to allow
d98f6e
 	 * the wait function to complete before we pull the rug out.
d98f6e
@@ -273,10 +287,10 @@
d98f6e
     } 
d98f6e
     delete slotList;
d98f6e
     delete log;
d98f6e
-    finalizeLock.getLock();
d98f6e
+    FINALIZE_GETLOCK();
d98f6e
     finalizing = FALSE;
d98f6e
     initialized = FALSE;
d98f6e
-    finalizeLock.releaseLock();
d98f6e
+    FINALIZE_RELEASELOCK();
d98f6e
     return CKR_OK;
d98f6e
 }
d98f6e
 
d98f6e
@@ -595,17 +609,17 @@
d98f6e
 CK_RV
d98f6e
 C_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, CK_VOID_PTR pReserved)
d98f6e
 {
d98f6e
-    finalizeLock.getLock();
d98f6e
+    FINALIZE_GETLOCK();
d98f6e
     if( ! initialized ) {
d98f6e
-        finalizeLock.releaseLock();
d98f6e
+	FINALIZE_RELEASELOCK();
d98f6e
         return CKR_CRYPTOKI_NOT_INITIALIZED;
d98f6e
     }
d98f6e
     if (finalizing) {
d98f6e
-        finalizeLock.releaseLock();
d98f6e
+	FINALIZE_RELEASELOCK();
d98f6e
         return CKR_CRYPTOKI_NOT_INITIALIZED;
d98f6e
     }
d98f6e
     waitEvent = TRUE;
d98f6e
-    finalizeLock.releaseLock();
d98f6e
+    FINALIZE_RELEASELOCK();
d98f6e
     try {
d98f6e
         log->log("C_WaitForSlotEvent called\n");
d98f6e
         slotList->waitForSlotEvent(flags, pSlot, pReserved);
d98f6e
Index: src/coolkey/machdep.cpp
d98f6e
===================================================================
d98f6e
RCS file: /cvs/dirsec/coolkey/src/coolkey/machdep.cpp,v
d98f6e
retrieving revision 1.7
d98f6e
diff -u -r1.7 machdep.cpp
d98f6e
--- src/coolkey/machdep.cpp	14 Feb 2008 23:48:19 -0000	1.7
d98f6e
+++ src/coolkey/machdep.cpp	18 Dec 2009 23:22:58 -0000
d98f6e
@@ -37,6 +37,8 @@
d98f6e
 #include <stdlib.h>
d98f6e
 #endif
d98f6e
 
d98f6e
+bool OSLock::needThread = 0;
d98f6e
+
d98f6e
 #ifdef _WIN32
d98f6e
 //
d98f6e
 // Windows functions to grab a named shared memory segment of a specific size,
d98f6e
@@ -123,6 +125,10 @@
d98f6e
 
d98f6e
 OSLock::OSLock(bool exceptionAllowed)
d98f6e
 {
d98f6e
+    if (!needThread) {
d98f6e
+	lockData = NULL;
d98f6e
+	return;
d98f6e
+    }
d98f6e
     lockData = new OSLockData;
d98f6e
     if (lockData) {
d98f6e
 	InitializeCriticalSection(&lockData->mutex);
d98f6e
@@ -360,6 +366,9 @@
d98f6e
     int rc;
d98f6e
 
d98f6e
     lockData = NULL;
d98f6e
+    if (!needThread) {
d98f6e
+	return;
d98f6e
+    }
d98f6e
 #ifdef MAC
d98f6e
     if (!OSLock_attr_init) {
d98f6e
 	rc = pthread_mutexattr_init(&OSLock_attr);
d98f6e
Index: src/coolkey/machdep.h
d98f6e
===================================================================
d98f6e
RCS file: /cvs/dirsec/coolkey/src/coolkey/machdep.h,v
d98f6e
retrieving revision 1.1
d98f6e
diff -u -r1.1 machdep.h
d98f6e
--- src/coolkey/machdep.h	9 Jun 2006 18:39:11 -0000	1.1
d98f6e
+++ src/coolkey/machdep.h	18 Dec 2009 23:22:58 -0000
d98f6e
@@ -40,12 +40,14 @@
d98f6e
 class OSLock {
d98f6e
 private:
d98f6e
    OSLockData *lockData;
d98f6e
+   static bool needThread;
d98f6e
 public:
d98f6e
    OSLock(bool exceptionAllowed = true);
d98f6e
    ~OSLock();
d98f6e
    bool isValid();
d98f6e
    void getLock();
d98f6e
    void releaseLock();
d98f6e
+   static void setThreadSafe(bool thread) { needThread = thread; }
d98f6e
 };
d98f6e
 
d98f6e
 typedef unsigned long OSTime;