Commit bcad2030 authored by Jimmy Brisson's avatar Jimmy Brisson Committed by Manish Pandey
Browse files

Use preallocated parts of the HASH struct



When OpenSSL's macro allocates the HASH struct, it allocates the fields
as well. After this allocation, the prior code would assign over the
pointers inside the HASH struct, leaking these fields. This patch
avoids allocating extra copies of these members.

Change-Id: I50a38b0a04b52ec54d6388db0f694feb578d2818
Signed-off-by: default avatarJimmy Brisson <jimmy.brisson@arm.com>
parent 4a34d18f
...@@ -158,51 +158,36 @@ X509_EXTENSION *ext_new_hash(int nid, int crit, const EVP_MD *md, ...@@ -158,51 +158,36 @@ X509_EXTENSION *ext_new_hash(int nid, int crit, const EVP_MD *md,
unsigned char *buf, size_t len) unsigned char *buf, size_t len)
{ {
X509_EXTENSION *ex; X509_EXTENSION *ex;
ASN1_OCTET_STRING *octet;
HASH *hash; HASH *hash;
ASN1_OBJECT *algorithm; ASN1_OBJECT *algorithm;
X509_ALGOR *x509_algor;
unsigned char *p = NULL; unsigned char *p = NULL;
int sz; int sz;
/* HASH structure containing algorithm + hash */
hash = HASH_new();
if (hash == NULL) {
return NULL;
}
/* OBJECT_IDENTIFIER with hash algorithm */ /* OBJECT_IDENTIFIER with hash algorithm */
algorithm = OBJ_nid2obj(EVP_MD_type(md)); algorithm = OBJ_nid2obj(EVP_MD_type(md));
if (algorithm == NULL) { if (algorithm == NULL) {
HASH_free(hash);
return NULL; return NULL;
} }
/* Create X509_ALGOR */ /* Create X509_ALGOR */
x509_algor = X509_ALGOR_new(); hash->hashAlgorithm->algorithm = algorithm;
if (x509_algor == NULL) { hash->hashAlgorithm->parameter = ASN1_TYPE_new();
return NULL; ASN1_TYPE_set(hash->hashAlgorithm->parameter, V_ASN1_NULL, NULL);
}
x509_algor->algorithm = algorithm;
x509_algor->parameter = ASN1_TYPE_new();
ASN1_TYPE_set(x509_algor->parameter, V_ASN1_NULL, NULL);
/* OCTET_STRING with the actual hash */ /* OCTET_STRING with the actual hash */
octet = ASN1_OCTET_STRING_new(); ASN1_OCTET_STRING_set(hash->dataHash, buf, len);
if (octet == NULL) {
X509_ALGOR_free(x509_algor);
return NULL;
}
ASN1_OCTET_STRING_set(octet, buf, len);
/* HASH structure containing algorithm + hash */
hash = HASH_new();
if (hash == NULL) {
ASN1_OCTET_STRING_free(octet);
X509_ALGOR_free(x509_algor);
return NULL;
}
hash->hashAlgorithm = x509_algor;
hash->dataHash = octet;
/* DER encoded HASH */ /* DER encoded HASH */
sz = i2d_HASH(hash, &p); sz = i2d_HASH(hash, &p);
if ((sz <= 0) || (p == NULL)) { if ((sz <= 0) || (p == NULL)) {
HASH_free(hash); HASH_free(hash);
X509_ALGOR_free(x509_algor);
return NULL; return NULL;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment