[pkg-opensc-commit] [pkcs11-helper] 226/253: openssl: lock session reference count

Eric Dorland eric at moszumanska.debian.org
Fri Jan 6 23:39:22 UTC 2017


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository pkcs11-helper.

commit 53e2c700026af6c38a7921bf961ad604e18f41a2
Author: Alon Bar-Lev <alon.barlev at gmail.com>
Date:   Mon Sep 23 00:36:43 2013 +0300

    openssl: lock session reference count
    
    Signed-off-by: Alon Bar-Lev <alon.barlev at gmail.com>
---
 lib/pkcs11h-openssl.c | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/lib/pkcs11h-openssl.c b/lib/pkcs11h-openssl.c
index 9d9546a..934caaa 100644
--- a/lib/pkcs11h-openssl.c
+++ b/lib/pkcs11h-openssl.c
@@ -70,7 +70,10 @@ typedef const unsigned char *__pkcs11_openssl_d2i_t;
 #endif
 
 struct pkcs11h_openssl_session_s {
-	int reference_count;
+#if defined(ENABLE_PKCS11H_THREADING)
+	_pkcs11h_mutex_t reference_count_lock;
+#endif
+	volatile int reference_count;
 	PKCS11H_BOOL initialized;
 	X509 *x509;
 	RSA_METHOD smart_rsa;
@@ -429,6 +432,7 @@ pkcs11h_openssl_createSession (
 ) {
 	const RSA_METHOD *def;
 	pkcs11h_openssl_session_t openssl_session = NULL;
+	CK_RV rv;
 	PKCS11H_BOOL ok = FALSE;
 
 	_PKCS11H_DEBUG (
@@ -461,6 +465,13 @@ pkcs11h_openssl_createSession (
 	openssl_session->certificate = certificate;
 	openssl_session->reference_count = 1;
 
+#if defined(ENABLE_PKCS11H_THREADING)
+	if ((rv = _pkcs11h_threading_mutexInit(&openssl_session->reference_count_lock)) != CKR_OK) {
+		_PKCS11H_LOG (PKCS11H_LOG_ERROR, "PKCS#11: Cannot initialize mutex %ld:'%s'", rv, pkcs11h_getMessage (rv));
+		goto cleanup;
+	}
+#endif
+
 	ok = TRUE;
 
 cleanup:
@@ -501,8 +512,9 @@ void
 pkcs11h_openssl_freeSession (
 	IN const pkcs11h_openssl_session_t openssl_session
 ) {
+	CK_RV rv;
+
 	_PKCS11H_ASSERT (openssl_session!=NULL);
-	_PKCS11H_ASSERT (openssl_session->reference_count>0);
 
 	_PKCS11H_DEBUG (
 		PKCS11H_LOG_DEBUG2,
@@ -511,9 +523,24 @@ pkcs11h_openssl_freeSession (
 		openssl_session->reference_count
 	);
 
+#if defined(ENABLE_PKCS11H_THREADING)
+	if ((rv = _pkcs11h_threading_mutexLock(&openssl_session->reference_count_lock)) != CKR_OK) {
+		_PKCS11H_LOG (PKCS11H_LOG_ERROR, "PKCS#11: Cannot lock mutex %ld:'%s'", rv, pkcs11h_getMessage (rv));
+		goto cleanup;
+	}
+#endif
 	openssl_session->reference_count--;
+#if defined(ENABLE_PKCS11H_THREADING)
+	_pkcs11h_threading_mutexRelease(&openssl_session->reference_count_lock);
+#endif
+
+	_PKCS11H_ASSERT (openssl_session->reference_count>=0);
 
 	if (openssl_session->reference_count == 0) {
+#if defined(ENABLE_PKCS11H_THREADING)
+		_pkcs11h_threading_mutexFree(&openssl_session->reference_count_lock);
+#endif
+
 		if (openssl_session->cleanup_hook != NULL) {
 			openssl_session->cleanup_hook (openssl_session->certificate);
 		}
@@ -530,6 +557,8 @@ pkcs11h_openssl_freeSession (
 		_pkcs11h_mem_free ((void *)&openssl_session);
 	}
 
+cleanup:
+
 	_PKCS11H_DEBUG (
 		PKCS11H_LOG_DEBUG2,
 		"PKCS#11: pkcs11h_openssl_freeSession - return"
@@ -582,7 +611,14 @@ pkcs11h_openssl_session_getRSA (
 
 	RSA_set_method (rsa, &openssl_session->smart_rsa);
 	RSA_set_ex_data (rsa, 0, openssl_session);
+
+#if defined(ENABLE_PKCS11H_THREADING)
+	_pkcs11h_threading_mutexLock(&openssl_session->reference_count_lock);
+#endif
 	openssl_session->reference_count++;
+#if defined(ENABLE_PKCS11H_THREADING)
+	_pkcs11h_threading_mutexRelease(&openssl_session->reference_count_lock);
+#endif
 
 #ifdef BROKEN_OPENSSL_ENGINE
 	if (!rsa->engine) {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/pkcs11-helper.git



More information about the pkg-opensc-commit mailing list