mirror of
https://github.com/openssl/openssl.git
synced 2024-11-24 10:34:12 +08:00
ASN1: Ensure that d2i_ASN1_OBJECT() frees the strings on ASN1_OBJECT reuse
The 'sn' and 'ln' strings may be dynamically allocated, and the ASN1_OBJECT flags have a bit set to say this. If an ASN1_OBJECT with such strings is passed to d2i_ASN1_OBJECT() for reuse, the strings must be freed, or there is a memory leak. Fixes #14667 Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/14938)
This commit is contained in:
parent
513ead8608
commit
65b88a7592
@ -286,16 +286,13 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* only the ASN1_OBJECTs from the 'table' will have values for ->sn or
|
|
||||||
* ->ln
|
|
||||||
*/
|
|
||||||
if ((a == NULL) || ((*a) == NULL) ||
|
if ((a == NULL) || ((*a) == NULL) ||
|
||||||
!((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) {
|
!((*a)->flags & ASN1_OBJECT_FLAG_DYNAMIC)) {
|
||||||
if ((ret = ASN1_OBJECT_new()) == NULL)
|
if ((ret = ASN1_OBJECT_new()) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
} else
|
} else {
|
||||||
ret = (*a);
|
ret = (*a);
|
||||||
|
}
|
||||||
|
|
||||||
p = *pp;
|
p = *pp;
|
||||||
/* detach data from object */
|
/* detach data from object */
|
||||||
@ -313,6 +310,12 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
|
|||||||
ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
|
ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA;
|
||||||
}
|
}
|
||||||
memcpy(data, p, length);
|
memcpy(data, p, length);
|
||||||
|
/* If there are dynamic strings, free them here, and clear the flag */
|
||||||
|
if ((ret->flags & ASN1_OBJECT_FLAG_DYNAMIC_STRINGS) != 0) {
|
||||||
|
OPENSSL_free((char *)ret->sn);
|
||||||
|
OPENSSL_free((char *)ret->ln);
|
||||||
|
ret->flags &= ~ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
|
||||||
|
}
|
||||||
/* reattach data to object, after which it remains const */
|
/* reattach data to object, after which it remains const */
|
||||||
ret->data = data;
|
ret->data = data;
|
||||||
ret->length = length;
|
ret->length = length;
|
||||||
|
Loading…
Reference in New Issue
Block a user