aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/asn1
diff options
context:
space:
mode:
authorAlessandro Ghedini <alessandro@ghedini.me>2016-03-01 18:06:15 +0000
committerRich Salz <rsalz@openssl.org>2016-03-08 11:10:34 -0500
commitc001ce33137993a0c4ff15060ed1639826bfca0b (patch)
tree0589954d36d7138b51b4e9906a2d728e9c25669c /crypto/asn1
parent41cfbccc99f3ca3c9f656d8c71e2db5bcfcf6817 (diff)
downloadopenssl-c001ce33137993a0c4ff15060ed1639826bfca0b.tar.gz
Convert CRYPTO_LOCK_X509_* to new multi-threading API
Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/asn1')
-rw-r--r--crypto/asn1/tasn_utl.c9
-rw-r--r--crypto/asn1/x_info.c15
-rw-r--r--crypto/asn1/x_pkey.c8
3 files changed, 27 insertions, 5 deletions
diff --git a/crypto/asn1/tasn_utl.c b/crypto/asn1/tasn_utl.c
index c840047cdf..41f2fc24a0 100644
--- a/crypto/asn1/tasn_utl.c
+++ b/crypto/asn1/tasn_utl.c
@@ -105,6 +105,7 @@ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
{
const ASN1_AUX *aux;
int *lck, ret;
+ CRYPTO_RWLOCK **lock;
if ((it->itype != ASN1_ITYPE_SEQUENCE)
&& (it->itype != ASN1_ITYPE_NDEF_SEQUENCE))
return 0;
@@ -112,15 +113,21 @@ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT))
return 0;
lck = offset2ptr(*pval, aux->ref_offset);
+ lock = offset2ptr(*pval, aux->ref_lock);
if (op == 0) {
*lck = 1;
+ *lock = CRYPTO_THREAD_lock_new();
+ if (*lock == NULL)
+ return 0;
return 1;
}
- ret = CRYPTO_add(lck, op, aux->ref_lock);
+ CRYPTO_atomic_add(lck, op, &ret, *lock);
#ifdef REF_PRINT
fprintf(stderr, "%p:%4d:%s\n", it, *lck, it->sname);
#endif
REF_ASSERT_ISNT(ret < 0);
+ if (ret == 0)
+ CRYPTO_THREAD_lock_free(*lock);
return ret;
}
diff --git a/crypto/asn1/x_info.c b/crypto/asn1/x_info.c
index adee224699..4b3b7de870 100644
--- a/crypto/asn1/x_info.c
+++ b/crypto/asn1/x_info.c
@@ -68,10 +68,18 @@ X509_INFO *X509_INFO_new(void)
ret = OPENSSL_zalloc(sizeof(*ret));
if (ret == NULL) {
ASN1err(ASN1_F_X509_INFO_NEW, ERR_R_MALLOC_FAILURE);
- return (NULL);
+ return NULL;
}
+
ret->references = 1;
- return (ret);
+
+ ret->lock = CRYPTO_THREAD_lock_new();
+ if (ret->lock == NULL) {
+ X509_INFO_free(ret);
+ return NULL;
+ }
+
+ return ret;
}
void X509_INFO_free(X509_INFO *x)
@@ -81,7 +89,7 @@ void X509_INFO_free(X509_INFO *x)
if (x == NULL)
return;
- i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_X509_INFO);
+ CRYPTO_atomic_add(&x->references, -1, &i, x->lock);
REF_PRINT_COUNT("X509_INFO", x);
if (i > 0)
return;
@@ -91,5 +99,6 @@ void X509_INFO_free(X509_INFO *x)
X509_CRL_free(x->crl);
X509_PKEY_free(x->x_pkey);
OPENSSL_free(x->enc_data);
+ CRYPTO_THREAD_lock_free(x->lock);
OPENSSL_free(x);
}
diff --git a/crypto/asn1/x_pkey.c b/crypto/asn1/x_pkey.c
index 6e09d29239..d8960d1541 100644
--- a/crypto/asn1/x_pkey.c
+++ b/crypto/asn1/x_pkey.c
@@ -70,6 +70,11 @@ X509_PKEY *X509_PKEY_new(void)
goto err;
ret->references = 1;
+ ret->lock = CRYPTO_THREAD_lock_new();
+ if (ret->lock == NULL) {
+ OPENSSL_free(ret);
+ return NULL;
+ }
ret->enc_algor = X509_ALGOR_new();
ret->enc_pkey = ASN1_OCTET_STRING_new();
if (ret->enc_algor == NULL || ret->enc_pkey == NULL)
@@ -89,7 +94,7 @@ void X509_PKEY_free(X509_PKEY *x)
if (x == NULL)
return;
- i = CRYPTO_add(&x->references, -1, CRYPTO_LOCK_X509_PKEY);
+ CRYPTO_atomic_add(&x->references, -1, &i, x->lock);
REF_PRINT_COUNT("X509_PKEY", x);
if (i > 0)
return;
@@ -100,5 +105,6 @@ void X509_PKEY_free(X509_PKEY *x)
EVP_PKEY_free(x->dec_pkey);
if (x->key_free)
OPENSSL_free(x->key_data);
+ CRYPTO_THREAD_lock_free(x->lock);
OPENSSL_free(x);
}