Fix leaks in and de-macro X509_PKEY_new. Caught by clang scan-build. Change-Id: I075ae0423ec72493f21608ab5704e2984ca3e86c Reviewed-on: https://boringssl-review.googlesource.com/2202 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/x509/x_pkey.c b/crypto/x509/x_pkey.c index b7d29f1..5e5ec3d 100644 --- a/crypto/x509/x_pkey.c +++ b/crypto/x509/x_pkey.c
@@ -63,7 +63,6 @@ OPENSSL_DECLARE_ERROR_FUNCTION(X509, d2i_X509_PKEY); -OPENSSL_DECLARE_ERROR_FUNCTION(X509, X509_PKEY_new); /* need to implement */ int i2d_X509_PKEY(X509_PKEY *a, unsigned char **pp) @@ -112,22 +111,27 @@ X509_PKEY *X509_PKEY_new(void) { - X509_PKEY *ret=NULL; - ASN1_CTX c; - - M_ASN1_New_Malloc(ret,X509_PKEY); - ret->version=0; - M_ASN1_New(ret->enc_algor,X509_ALGOR_new); - M_ASN1_New(ret->enc_pkey,M_ASN1_OCTET_STRING_new); - ret->dec_pkey=NULL; - ret->key_length=0; - ret->key_data=NULL; - ret->key_free=0; - ret->cipher.cipher=NULL; - memset(ret->cipher.iv,0,EVP_MAX_IV_LENGTH); + X509_PKEY *ret = OPENSSL_malloc(sizeof(X509_PKEY)); + if (ret == NULL) + { + OPENSSL_PUT_ERROR(X509, X509_PKEY_new, ERR_R_MALLOC_FAILURE); + goto err; + } + memset(ret, 0, sizeof(X509_PKEY)); ret->references=1; - return(ret); - M_ASN1_New_Error(X509_F_X509_PKEY_new); + + ret->enc_algor = X509_ALGOR_new(); + if (ret->enc_algor == NULL) + goto err; + ret->enc_pkey = M_ASN1_OCTET_STRING_new(); + if (ret->enc_pkey == NULL) + goto err; + return ret; + +err: + if (ret != NULL) + X509_PKEY_free(ret); + return NULL; } void X509_PKEY_free(X509_PKEY *x)