diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2016-03-04 15:43:46 +0000 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-03-08 09:07:32 -0500 |
commit | d188a53617de68a707fe9459d4f4245d9a57cd9c (patch) | |
tree | 5280ea92a3c2772e7c0446efa6fede7eba6e7eb4 /crypto/rsa/rsa_lib.c | |
parent | f989cd8c0bb3c579d112294bf8e304647b334ee8 (diff) |
Convert CRYPTO_LOCK_{DH,DSA,RSA} to new multi-threading API
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/rsa/rsa_lib.c')
-rw-r--r-- | crypto/rsa/rsa_lib.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/crypto/rsa/rsa_lib.c b/crypto/rsa/rsa_lib.c index 8b5015703c..9cc88142b6 100644 --- a/crypto/rsa/rsa_lib.c +++ b/crypto/rsa/rsa_lib.c @@ -157,18 +157,25 @@ RSA *RSA_new_method(ENGINE *engine) ENGINE_finish(ret->engine); #endif OPENSSL_free(ret); - return (NULL); + return NULL; } - if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { + ret->lock = CRYPTO_THREAD_lock_new(); + if (ret->lock == NULL) { #ifndef OPENSSL_NO_ENGINE ENGINE_finish(ret->engine); #endif CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data); OPENSSL_free(ret); + return NULL; + } + + if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { + RSA_free(ret); ret = NULL; } - return (ret); + + return ret; } void RSA_free(RSA *r) @@ -178,7 +185,7 @@ void RSA_free(RSA *r) if (r == NULL) return; - i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_RSA); + CRYPTO_atomic_add(&r->references, -1, &i, r->lock); REF_PRINT_COUNT("RSA", r); if (i > 0) return; @@ -192,6 +199,8 @@ void RSA_free(RSA *r) CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, r, &r->ex_data); + CRYPTO_THREAD_lock_free(r->lock); + BN_clear_free(r->n); BN_clear_free(r->e); BN_clear_free(r->d); @@ -208,7 +217,10 @@ void RSA_free(RSA *r) int RSA_up_ref(RSA *r) { - int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA); + int i; + + if (CRYPTO_atomic_add(&r->references, 1, &i, r->lock) <= 0) + return 0; REF_PRINT_COUNT("RSA", r); REF_ASSERT_ISNT(i < 2); |