mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
ASN.1: extend the possibilities to embed data instead of pointers
Also, when "allocating" or "deallocating" an embedded item, never call prim_new() or prim_free(). Call prim_clear() instead. Fixes #3191 Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3199)
This commit is contained in:
parent
8edefd7bb3
commit
49005bb8b3
@ -155,7 +155,12 @@ void asn1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it, int embed)
|
|||||||
if (it) {
|
if (it) {
|
||||||
const ASN1_PRIMITIVE_FUNCS *pf = it->funcs;
|
const ASN1_PRIMITIVE_FUNCS *pf = it->funcs;
|
||||||
|
|
||||||
if (pf && pf->prim_free) {
|
if (embed) {
|
||||||
|
if (pf && pf->prim_clear) {
|
||||||
|
pf->prim_clear(pval, it);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (pf && pf->prim_free) {
|
||||||
pf->prim_free(pval, it);
|
pf->prim_free(pval, it);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -266,8 +266,14 @@ static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
|||||||
|
|
||||||
if (it->funcs) {
|
if (it->funcs) {
|
||||||
const ASN1_PRIMITIVE_FUNCS *pf = it->funcs;
|
const ASN1_PRIMITIVE_FUNCS *pf = it->funcs;
|
||||||
if (pf->prim_new)
|
if (embed) {
|
||||||
|
if (pf->prim_clear) {
|
||||||
|
pf->prim_clear(pval, it);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (pf->prim_new) {
|
||||||
return pf->prim_new(pval, it);
|
return pf->prim_new(pval, it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (it->itype == ASN1_ITYPE_MSTRING)
|
if (it->itype == ASN1_ITYPE_MSTRING)
|
||||||
|
@ -346,17 +346,22 @@ extern "C" {
|
|||||||
|
|
||||||
/* OPTIONAL simple type */
|
/* OPTIONAL simple type */
|
||||||
# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
|
# define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)
|
||||||
|
# define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED, 0, stname, field, type)
|
||||||
|
|
||||||
/* IMPLICIT tagged simple type */
|
/* IMPLICIT tagged simple type */
|
||||||
# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
|
# define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)
|
||||||
|
# define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED)
|
||||||
|
|
||||||
/* IMPLICIT tagged OPTIONAL simple type */
|
/* IMPLICIT tagged OPTIONAL simple type */
|
||||||
# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
# define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
||||||
|
# define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED)
|
||||||
|
|
||||||
/* Same as above but EXPLICIT */
|
/* Same as above but EXPLICIT */
|
||||||
|
|
||||||
# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
|
# define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
|
||||||
|
# define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED)
|
||||||
# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
# define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)
|
||||||
|
# define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_EMBED)
|
||||||
|
|
||||||
/* SEQUENCE OF type */
|
/* SEQUENCE OF type */
|
||||||
# define ASN1_SEQUENCE_OF(stname, field, type) \
|
# define ASN1_SEQUENCE_OF(stname, field, type) \
|
||||||
|
Loading…
Reference in New Issue
Block a user