[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