From: Pauli Date: Thu, 25 Mar 2021 07:53:57 +0000 (+1000) Subject: Fix X509_PUBKEY_dup() to not leak memory X-Git-Tag: openssl-3.0.0-alpha14~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7aa284e68b6436aee9b2f8e2145e783b5fea28d;p=thirdparty%2Fopenssl.git Fix X509_PUBKEY_dup() to not leak memory Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/14642) --- diff --git a/crypto/x509/x_pubkey.c b/crypto/x509/x_pubkey.c index e9fcf8ef56d..5099f9618af 100644 --- a/crypto/x509/x_pubkey.c +++ b/crypto/x509/x_pubkey.c @@ -207,22 +207,20 @@ IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY) */ X509_PUBKEY *X509_PUBKEY_dup(const X509_PUBKEY *a) { - X509_PUBKEY *pubkey = NULL; - - if (!x509_pubkey_ex_new((ASN1_VALUE **)&pubkey, - ASN1_ITEM_rptr(X509_PUBKEY_INTERNAL)) - || !x509_pubkey_set0_libctx(pubkey, a->libctx, a->propq) - || (pubkey->algor = X509_ALGOR_dup(a->algor)) == NULL - || (pubkey->public_key = ASN1_BIT_STRING_new()) == NULL - || !ASN1_BIT_STRING_set(pubkey->public_key, - a->public_key->data, a->public_key->length) - || (a->pkey != NULL && !EVP_PKEY_up_ref(a->pkey))) { + X509_PUBKEY *pubkey = OPENSSL_zalloc(sizeof(*pubkey)); + + if (pubkey == NULL + || !x509_pubkey_set0_libctx(pubkey, a->libctx, a->propq) + || (pubkey->algor = X509_ALGOR_dup(a->algor)) == NULL + || (pubkey->public_key = ASN1_BIT_STRING_new()) == NULL + || !ASN1_BIT_STRING_set(pubkey->public_key, + a->public_key->data, a->public_key->length) + || (a->pkey != NULL && !EVP_PKEY_up_ref(a->pkey))) { x509_pubkey_ex_free((ASN1_VALUE **)&pubkey, ASN1_ITEM_rptr(X509_PUBKEY_INTERNAL)); ERR_raise(ERR_LIB_X509, ERR_R_MALLOC_FAILURE); return NULL; } - pubkey->pkey = a->pkey; return pubkey; }