提交 47c9a1b5 编写于 作者: D Dr. Stephen Henson

embed support for ASN1_STRING

Reviewed-by: NRich Salz <rsalz@openssl.org>
上级 a332635e
...@@ -363,6 +363,7 @@ void ASN1_STRING_free(ASN1_STRING *a) ...@@ -363,6 +363,7 @@ 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);
if (!(a->flags & ASN1_STRING_FLAG_EMBED))
OPENSSL_free(a); OPENSSL_free(a);
} }
......
...@@ -67,7 +67,8 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -347,10 +349,16 @@ static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
break; break;
default: default:
if (embed) {
str = *(ASN1_STRING **)pval;
memset(str, 0, sizeof(*str));
str->flags = ASN1_STRING_FLAG_EMBED;
} else {
str = ASN1_STRING_type_new(utype); 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) ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册