| From: Adam Langley <agl@google.com> |
| Date: Tue, 5 May 2015 10:35:22 -0700 |
| Subject: [PATCH] Add |BIO_up_ref| and |EVP_PKEY_up_ref|. |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| This avoids callers having to worry about |CRYPTO_add| and what the |
| correct lock to use it with is. |
| |
| The function |EVP_PKEY_dup| already does exactly what the new |
| |EVP_PKEY_up_ref| does. But that means that it's a “dup” that doesn't |
| duplicate! BoringSSL has deprecated this and added |EVP_PKEY_up_ref| to |
| be clearer and this change allows internal OpenSSL users to do the same. |
| --- |
| crypto/bio/bio.h | 1 + |
| crypto/bio/bio_lib.c | 6 ++++++ |
| crypto/evp/evp.h | 1 + |
| crypto/evp/p_lib.c | 8 ++++++-- |
| 4 files changed, 14 insertions(+), 2 deletions(-) |
| |
| diff --git a/crypto/bio/bio.h b/crypto/bio/bio.h |
| index c947abb..d1b4aa0 100644 |
| --- a/crypto/bio/bio.h |
| +++ b/crypto/bio/bio.h |
| @@ -642,6 +645,7 @@ |
| int BIO_set(BIO *a,BIO_METHOD *type); |
| int BIO_free(BIO *a); |
| void BIO_vfree(BIO *a); |
| +BIO * BIO_up_ref(BIO *bio); |
| int BIO_read(BIO *b, void *data, int len); |
| int BIO_gets(BIO *bp,char *buf, int size); |
| int BIO_write(BIO *b, const void *data, int len); |
| diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c |
| index 5267010..a021f38 100644 |
| --- a/crypto/bio/bio_lib.c |
| +++ b/crypto/bio/bio_lib.c |
| @@ -140,6 +140,12 @@ void BIO_vfree(BIO *a) |
| BIO_free(a); |
| } |
| |
| +BIO *BIO_up_ref(BIO *bio) |
| +{ |
| + CRYPTO_add(&bio->references, 1, CRYPTO_LOCK_BIO); |
| + return bio; |
| +} |
| + |
| void BIO_clear_flags(BIO *b, int flags) |
| { |
| b->flags &= ~flags; |
| diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h |
| index 48f865a..5f253da 100644 |
| --- a/crypto/evp/evp.h |
| +++ b/crypto/evp/evp.h |
| @@ -921,8 +921,9 @@ |
| #endif |
| |
| EVP_PKEY * EVP_PKEY_new(void); |
| EVP_PKEY * EVP_PKEY_dup(EVP_PKEY *pkey); |
| void EVP_PKEY_free(EVP_PKEY *pkey); |
| +EVP_PKEY * EVP_PKEY_up_ref(EVP_PKEY *pkey); |
| |
| EVP_PKEY * d2i_PublicKey(int type,EVP_PKEY **a, const unsigned char **pp, |
| long length); |
| diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c |
| index 8ab8f62..628697b 100644 |
| --- a/crypto/evp/p_lib.c |
| +++ b/crypto/evp/p_lib.c |
| @@ -200,12 +200,11 @@ |
| return(ret); |
| } |
| |
| EVP_PKEY *EVP_PKEY_dup(EVP_PKEY *pkey) |
| { |
| - CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); |
| - return pkey; |
| + return EVP_PKEY_up_ref(pkey); |
| } |
| |
| /* Setup a public key ASN1 method and ENGINE from a NID or a string. |
| * If pkey is NULL just return 1 or 0 if the algorithm exists. |
| */ |
| @@ -408,6 +413,12 @@ |
| OPENSSL_free(x); |
| } |
| |
| +EVP_PKEY *EVP_PKEY_up_ref(EVP_PKEY *pkey) |
| + { |
| + CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); |
| + return pkey; |
| + } |
| + |
| static void EVP_PKEY_free_it(EVP_PKEY *x) |
| { |
| if (x->ameth && x->ameth->pkey_free) |
| -- |