aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2003-10-06 09:09:44 +0000
committerRichard Levitte <levitte@openssl.org>2003-10-06 09:09:44 +0000
commitc40b9bdefb59be7e640cd7a10bfd2fa26ea1fe7b (patch)
tree9264f58ab5c0cbe3824adc5c8ecc3883ddb1e83f /crypto
parent6895cca89d47b30708e41da5a7f86277f526cbe6 (diff)
downloadopenssl-c40b9bdefb59be7e640cd7a10bfd2fa26ea1fe7b.tar.gz
Setting the ex_data index is unsafe in a threaded environment, so
let's wrap it with a lock.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/comp/c_zlib.c9
-rw-r--r--crypto/cryptlib.c3
-rw-r--r--crypto/crypto.h3
3 files changed, 10 insertions, 5 deletions
diff --git a/crypto/comp/c_zlib.c b/crypto/comp/c_zlib.c
index c3167fcead..7553a2d107 100644
--- a/crypto/comp/c_zlib.c
+++ b/crypto/comp/c_zlib.c
@@ -178,9 +178,12 @@ static int zlib_stateful_init(COMP_CTX *ctx)
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_COMP,ctx,&ctx->ex_data);
if (zlib_stateful_ex_idx == -1)
{
- zlib_stateful_ex_idx =
- CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_COMP,
- 0,NULL,NULL,NULL,zlib_stateful_free_ex_data);
+ CRYPTO_w_lock(CRYPTO_LOCK_COMP);
+ if (zlib_stateful_ex_idx == -1)
+ zlib_stateful_ex_idx =
+ CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_COMP,
+ 0,NULL,NULL,NULL,zlib_stateful_free_ex_data);
+ CRYPTO_w_unlock(CRYPTO_LOCK_COMP);
if (zlib_stateful_ex_idx == -1)
goto err;
}
diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c
index 9c38f15ab2..009c3be4c0 100644
--- a/crypto/cryptlib.c
+++ b/crypto/cryptlib.c
@@ -168,7 +168,8 @@ static const char* lock_names[CRYPTO_NUM_LOCKS] =
"bn",
"ec_pre_comp",
"store",
-#if CRYPTO_NUM_LOCKS != 38
+ "comp",
+#if CRYPTO_NUM_LOCKS != 39
# error "Inconsistency between crypto.h and cryptlib.c"
#endif
};
diff --git a/crypto/crypto.h b/crypto/crypto.h
index dd90cfa55d..5238e53066 100644
--- a/crypto/crypto.h
+++ b/crypto/crypto.h
@@ -203,7 +203,8 @@ typedef struct openssl_item_st
#define CRYPTO_LOCK_BN 35
#define CRYPTO_LOCK_EC_PRE_COMP 36
#define CRYPTO_LOCK_STORE 37
-#define CRYPTO_NUM_LOCKS 38
+#define CRYPTO_LOCK_COMP 38
+#define CRYPTO_NUM_LOCKS 39
#define CRYPTO_LOCK 1
#define CRYPTO_UNLOCK 2