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;
|
return;
|
||||||
if (!(a->flags & ASN1_STRING_FLAG_NDEF))
|
if (!(a->flags & ASN1_STRING_FLAG_NDEF))
|
||||||
OPENSSL_free(a->data);
|
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)
|
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,
|
static int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
int embed);
|
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 void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
||||||
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
||||||
static void asn1_template_clear(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 (it->templates) {
|
||||||
if (!asn1_template_new(pval, it->templates))
|
if (!asn1_template_new(pval, it->templates))
|
||||||
goto memerr;
|
goto memerr;
|
||||||
} else if (!asn1_primitive_new(pval, it))
|
} else if (!asn1_primitive_new(pval, it, embed))
|
||||||
goto memerr;
|
goto memerr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ASN1_ITYPE_MSTRING:
|
case ASN1_ITYPE_MSTRING:
|
||||||
if (!asn1_primitive_new(pval, it))
|
if (!asn1_primitive_new(pval, it, embed))
|
||||||
goto memerr;
|
goto memerr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -305,7 +306,8 @@ static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
|||||||
* all the old functions.
|
* 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_TYPE *typ;
|
||||||
ASN1_STRING *str;
|
ASN1_STRING *str;
|
||||||
@ -347,10 +349,16 @@ static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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)
|
if (it->itype == ASN1_ITYPE_MSTRING && str)
|
||||||
str->flags |= ASN1_STRING_FLAG_MSTRING;
|
str->flags |= ASN1_STRING_FLAG_MSTRING;
|
||||||
*pval = (ASN1_VALUE *)str;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*pval)
|
if (*pval)
|
||||||
|
@ -179,6 +179,8 @@ DECLARE_STACK_OF(X509_ALGOR)
|
|||||||
* type.
|
* type.
|
||||||
*/
|
*/
|
||||||
# define ASN1_STRING_FLAG_MSTRING 0x040
|
# 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 :-) */
|
/* This is the base type that holds just about everything :-) */
|
||||||
struct asn1_string_st {
|
struct asn1_string_st {
|
||||||
int length;
|
int length;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user