From: Jonas Maebe Date: Mon, 2 Dec 2013 20:46:46 +0000 (+0100) Subject: ssl_cert_dup: Fix memory leak X-Git-Tag: master-pre-reformat~178 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3b966fb878766c67060d384fb4f917ea16269a7;p=openssl ssl_cert_dup: Fix memory leak Always use goto err on failure and call ssl_cert_free() on the error path so all fields and "ret" itself are freed Signed-off-by: Kurt Roeckx Reviewed-by: Richard Levitte --- diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c index f214bafe4a..6dbf79a488 100644 --- a/ssl/ssl_cert.c +++ b/ssl/ssl_cert.c @@ -315,7 +315,7 @@ CERT *ssl_cert_dup(CERT *cert) if (ret->pkeys[i].serverinfo == NULL) { SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE); - return NULL; + goto err; } ret->pkeys[i].serverinfo_length = cert->pkeys[i].serverinfo_length; @@ -403,28 +403,8 @@ CERT *ssl_cert_dup(CERT *cert) return(ret); -#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_ECDH) err: -#endif -#ifndef OPENSSL_NO_RSA - if (ret->rsa_tmp != NULL) - RSA_free(ret->rsa_tmp); -#endif -#ifndef OPENSSL_NO_DH - if (ret->dh_tmp != NULL) - DH_free(ret->dh_tmp); -#endif -#ifndef OPENSSL_NO_ECDH - if (ret->ecdh_tmp != NULL) - EC_KEY_free(ret->ecdh_tmp); -#endif - -#ifndef OPENSSL_NO_TLSEXT - custom_exts_free(&ret->cli_ext); - custom_exts_free(&ret->srv_ext); -#endif - - ssl_cert_clear_certs(ret); + ssl_cert_free(ret); return NULL; }