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)