diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2016-03-01 18:06:15 +0000 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-03-08 11:10:34 -0500 |
commit | c001ce33137993a0c4ff15060ed1639826bfca0b (patch) | |
tree | 0589954d36d7138b51b4e9906a2d728e9c25669c /crypto/asn1 | |
parent | 41cfbccc99f3ca3c9f656d8c71e2db5bcfcf6817 (diff) | |
download | openssl-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.c | 9 | ||||
-rw-r--r-- | crypto/asn1/x_info.c | 15 | ||||
-rw-r--r-- | crypto/asn1/x_pkey.c | 8 |
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); } |