summaryrefslogtreecommitdiff
path: root/Cryptlib/OpenSSL/crypto/asn1/a_object.c
diff options
context:
space:
mode:
authorGary Ching-Pang Lin <glin@suse.com>2015-07-28 11:46:38 -0400
committerPeter Jones <pjones@redhat.com>2015-07-28 11:46:38 -0400
commit5ce38c90cf43ee79cd999716ea83a5a44eeb819e (patch)
tree2fb3d9dd667c772fae5f87fa61e1501cf12da0ce /Cryptlib/OpenSSL/crypto/asn1/a_object.c
parent69ba24ff72921ecabbb47178de40dc5a79350040 (diff)
downloadefi-boot-shim-5ce38c90cf43ee79cd999716ea83a5a44eeb819e.tar.gz
efi-boot-shim-5ce38c90cf43ee79cd999716ea83a5a44eeb819e.zip
Update openssl to 1.0.2d
Also update Cryptlib to edk2 r17731 Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
Diffstat (limited to 'Cryptlib/OpenSSL/crypto/asn1/a_object.c')
-rw-r--r--Cryptlib/OpenSSL/crypto/asn1/a_object.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/Cryptlib/OpenSSL/crypto/asn1/a_object.c b/Cryptlib/OpenSSL/crypto/asn1/a_object.c
index aa1847cf..27f9c169 100644
--- a/Cryptlib/OpenSSL/crypto/asn1/a_object.c
+++ b/Cryptlib/OpenSSL/crypto/asn1/a_object.c
@@ -262,8 +262,6 @@ ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
return ret;
err:
ASN1err(ASN1_F_D2I_ASN1_OBJECT, i);
- if ((ret != NULL) && ((a == NULL) || (*a != ret)))
- ASN1_OBJECT_free(ret);
return (NULL);
}
@@ -272,6 +270,7 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
{
ASN1_OBJECT *ret = NULL;
const unsigned char *p;
+ unsigned char *data;
int i, length;
/*
@@ -305,17 +304,24 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
ret = (*a);
p = *pp;
- if ((ret->data == NULL) || (ret->length < length)) {
- if (ret->data != NULL)
- OPENSSL_free(ret->data);
- ret->data = (unsigned char *)OPENSSL_malloc(length);
- ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
- if (ret->data == NULL) {
+ /* detach data from object */
+ data = (unsigned char *)ret->data;
+ ret->data = NULL;
+ /* once detached we can change it */
+ if ((data == NULL) || (ret->length < length)) {
+ ret->length = 0;
+ if (data != NULL)
+ OPENSSL_free(data);
+ data = (unsigned char *)OPENSSL_malloc(length);
+ if (data == NULL) {
i = ERR_R_MALLOC_FAILURE;
goto err;
}
+ ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
}
- memcpy(ret->data, p, length);
+ memcpy(data, p, length);
+ /* reattach data to object, after which it remains const */
+ ret->data = data;
ret->length = length;
ret->sn = NULL;
ret->ln = NULL;
@@ -368,7 +374,7 @@ void ASN1_OBJECT_free(ASN1_OBJECT *a)
}
if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA) {
if (a->data != NULL)
- OPENSSL_free(a->data);
+ OPENSSL_free((void *)a->data);
a->data = NULL;
a->length = 0;
}