mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
embed support for ASN1_STRING
Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
a332635ea0
commit
47c9a1b509
@ -363,7 +363,8 @@ void ASN1_STRING_free(ASN1_STRING *a)
|
||||
return;
|
||||
if (!(a->flags & ASN1_STRING_FLAG_NDEF))
|
||||
OPENSSL_free(a->data);
|
||||
OPENSSL_free(a);
|
||||
if (!(a->flags & ASN1_STRING_FLAG_EMBED))
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
void ASN1_STRING_clear_free(ASN1_STRING *a)
|
||||
|
@ -67,7 +67,8 @@
|
||||
|
||||
static int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
int embed);
|
||||
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
||||
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
int embed);
|
||||
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
||||
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
||||
static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
||||
@ -120,12 +121,12 @@ int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int embed)
|
||||
if (it->templates) {
|
||||
if (!asn1_template_new(pval, it->templates))
|
||||
goto memerr;
|
||||
} else if (!asn1_primitive_new(pval, it))
|
||||
} else if (!asn1_primitive_new(pval, it, embed))
|
||||
goto memerr;
|
||||
break;
|
||||
|
||||
case ASN1_ITYPE_MSTRING:
|
||||
if (!asn1_primitive_new(pval, it))
|
||||
if (!asn1_primitive_new(pval, it, embed))
|
||||
goto memerr;
|
||||
break;
|
||||
|
||||
@ -305,7 +306,8 @@ static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
||||
* all the old functions.
|
||||
*/
|
||||
|
||||
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
int embed)
|
||||
{
|
||||
ASN1_TYPE *typ;
|
||||
ASN1_STRING *str;
|
||||
@ -347,10 +349,16 @@ static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||
break;
|
||||
|
||||
default:
|
||||
str = ASN1_STRING_type_new(utype);
|
||||
if (embed) {
|
||||
str = *(ASN1_STRING **)pval;
|
||||
memset(str, 0, sizeof(*str));
|
||||
str->flags = ASN1_STRING_FLAG_EMBED;
|
||||
} else {
|
||||
str = ASN1_STRING_type_new(utype);
|
||||
*pval = (ASN1_VALUE *)str;
|
||||
}
|
||||
if (it->itype == ASN1_ITYPE_MSTRING && str)
|
||||
str->flags |= ASN1_STRING_FLAG_MSTRING;
|
||||
*pval = (ASN1_VALUE *)str;
|
||||
break;
|
||||
}
|
||||
if (*pval)
|
||||
|
@ -179,6 +179,8 @@ DECLARE_STACK_OF(X509_ALGOR)
|
||||
* type.
|
||||
*/
|
||||
# define ASN1_STRING_FLAG_MSTRING 0x040
|
||||
/* String is embedded and only content should be freed */
|
||||
# define ASN1_STRING_FLAG_EMBED 0x080
|
||||
/* This is the base type that holds just about everything :-) */
|
||||
struct asn1_string_st {
|
||||
int length;
|
||||
|
Loading…
Reference in New Issue
Block a user