diff --git a/ChangeLog b/ChangeLog index 5d220f88..8c9d5698 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.22: 2006-Oct-16 +0.9.22: 2006-Oct-18 * Added -pdu=all and -pdu= switches to asn1c. * Added PER support for most known-multiplier string types: @@ -8,6 +8,8 @@ as well as REAL and OBJECT IDENTIFIER. TODO: SET, UniversalString and BMPString. * Multiple enhancements by Daniele Varrazzo + * Fixed explicit tagging of an in-lined constructed type. + (Severity: low; Security impact: none). 0.9.21: 2006-Sep-17 diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 9d3cff57..bc9102ec 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2151,7 +2151,9 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) { OUT(",\n"); if(C99_MODE) OUT(".tag_mode = "); - if(expr->tag.tag_class) { + if((!(expr->expr_type & ASN_CONSTR_MASK) + || expr->expr_type == ASN_CONSTR_CHOICE) + && expr->tag.tag_class) { if(expr->tag.tag_mode == TM_IMPLICIT) OUT("-1,\t/* IMPLICIT tag at current level */\n"); else diff --git a/tests/119-per-strings-OK.asn1.-Pgen-PER b/tests/119-per-strings-OK.asn1.-Pgen-PER index f5736d05..e94558e3 100644 --- a/tests/119-per-strings-OK.asn1.-Pgen-PER +++ b/tests/119-per-strings-OK.asn1.-Pgen-PER @@ -801,7 +801,7 @@ asn_TYPE_descriptor_t asn_DEF_many_2 = { static asn_TYPE_member_t asn_MBR_PDU_1[] = { { ATF_POINTER, 21, offsetof(struct PDU, many), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_many_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* No PER visible constraints */ diff --git a/tests/22-tags-OK.asn1.-P b/tests/22-tags-OK.asn1.-P new file mode 100644 index 00000000..988e7293 --- /dev/null +++ b/tests/22-tags-OK.asn1.-P @@ -0,0 +1,170 @@ + +/*** <<< INCLUDES [T1] >>> ***/ + +#include +#include +#include +#include +#include + +/*** <<< DEPS [T1] >>> ***/ + +typedef enum b_PR { + b_PR_NOTHING, /* No components present */ + b_PR_i, + b_PR_n +} b_PR; + +/*** <<< TYPE-DECLS [T1] >>> ***/ + +typedef struct T1 { + INTEGER_t a; + struct b { + b_PR present; + union T1__b_u { + INTEGER_t i; + IA5String_t n; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } b; + UTF8String_t c; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} T1_t; + +/*** <<< FUNC-DECLS [T1] >>> ***/ + +extern asn_TYPE_descriptor_t asn_DEF_T1; + +/*** <<< STAT-DEFS [T1] >>> ***/ + +static asn_TYPE_member_t asn_MBR_b_3[] = { + { ATF_NOFLAGS, 0, offsetof(struct b, choice.i), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "i" + }, + { ATF_NOFLAGS, 0, offsetof(struct b, choice.n), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_IA5String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "n" + }, +}; +static asn_TYPE_tag2member_t asn_MAP_b_tag2el_3[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* i at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* n at 18 */ +}; +static asn_CHOICE_specifics_t asn_SPC_b_specs_3 = { + sizeof(struct b), + offsetof(struct b, _asn_ctx), + offsetof(struct b, present), + sizeof(((struct b *)0)->present), + asn_MAP_b_tag2el_3, + 2, /* Count of tags in the map */ + .canonical_order = 0, + .ext_start = -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_b_3 = { + "b", + "b", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_b_3, + 2, /* Elements count */ + &asn_SPC_b_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_T1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct T1, a), + .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_INTEGER, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "a" + }, + { ATF_NOFLAGS, 0, offsetof(struct T1, b), + .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + .tag_mode = +1, /* EXPLICIT tag at current level */ + .type = &asn_DEF_b_3, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "b" + }, + { ATF_NOFLAGS, 0, offsetof(struct T1, c), + .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + .tag_mode = -1, /* IMPLICIT tag at current level */ + .type = &asn_DEF_UTF8String, + .memb_constraints = 0, /* Defer constraints checking to the member type */ + .per_constraints = 0, /* PER is not compiled, use -gen-PER */ + .default_value = 0, + .name = "c" + }, +}; +static ber_tlv_tag_t asn_DEF_T1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_TYPE_tag2member_t asn_MAP_T1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 15 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* b at 17 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* c at 20 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_T1_specs_1 = { + sizeof(struct T1), + offsetof(struct T1, _asn_ctx), + asn_MAP_T1_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_T1 = { + "T1", + "T1", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_T1_tags_1, + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + asn_DEF_T1_tags_1, /* Same as above */ + sizeof(asn_DEF_T1_tags_1) + /sizeof(asn_DEF_T1_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_T1_1, + 3, /* Elements count */ + &asn_SPC_T1_specs_1 /* Additional specs */ +}; + diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P index 3a8cb1b2..576f5c45 100644 --- a/tests/31-set-of-OK.asn1.-P +++ b/tests/31-set-of-OK.asn1.-P @@ -442,7 +442,7 @@ asn_TYPE_descriptor_t asn_DEF_other_9 = { static asn_TYPE_member_t asn_MBR_Stuff_1[] = { { ATF_POINTER, 3, offsetof(struct Stuff, trees), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_trees_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -451,7 +451,7 @@ static asn_TYPE_member_t asn_MBR_Stuff_1[] = { }, { ATF_POINTER, 2, offsetof(struct Stuff, anything), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_anything_4, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P index 84f0ce03..9037596e 100644 --- a/tests/32-sequence-of-OK.asn1.-P +++ b/tests/32-sequence-of-OK.asn1.-P @@ -294,7 +294,7 @@ static asn_TYPE_member_t asn_MBR_SeqWithMandatory_1[] = { }, { ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, seqOfMan), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = +1, /* EXPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_seqOfMan_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -436,7 +436,7 @@ static asn_TYPE_member_t asn_MBR_SeqWithOptional_1[] = { }, { ATF_POINTER, 1, offsetof(struct SeqWithOptional, seqOfOpt), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = +1, /* EXPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_seqOfOpt_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P index 7a0b0d35..3f2555c0 100644 --- a/tests/43-recursion-OK.asn1.-P +++ b/tests/43-recursion-OK.asn1.-P @@ -321,7 +321,7 @@ static asn_TYPE_member_t asn_MBR_Choice_1_1[] = { }, { ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_or_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ diff --git a/tests/92-circular-loops-OK.asn1.-P b/tests/92-circular-loops-OK.asn1.-P index 5570aa5b..e479edc8 100644 --- a/tests/92-circular-loops-OK.asn1.-P +++ b/tests/92-circular-loops-OK.asn1.-P @@ -546,7 +546,7 @@ asn_TYPE_descriptor_t asn_DEF_c_5 = { static asn_TYPE_member_t asn_MBR_Choice3_1[] = { { ATF_NOFLAGS, 0, offsetof(struct Choice3, choice.a), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_a_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -564,7 +564,7 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { }, { ATF_NOFLAGS, 0, offsetof(struct Choice3, choice.c), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_c_5, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -1129,7 +1129,7 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { }, { ATF_NOFLAGS, 0, offsetof(struct Alpha, b), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_b_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice index 9c9170bc..939056ec 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice +++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice @@ -547,7 +547,7 @@ asn_TYPE_descriptor_t asn_DEF_c_5 = { static asn_TYPE_member_t asn_MBR_Choice3_1[] = { { ATF_POINTER, 0, offsetof(struct Choice3, choice.a), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_a_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -565,7 +565,7 @@ static asn_TYPE_member_t asn_MBR_Choice3_1[] = { }, { ATF_POINTER, 0, offsetof(struct Choice3, choice.c), .tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_c_5, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ @@ -1130,7 +1130,7 @@ static asn_TYPE_member_t asn_MBR_Alpha_1[] = { }, { ATF_NOFLAGS, 0, offsetof(struct Alpha, b), .tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_b_3, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */ diff --git a/tests/93-asn1c-controls-OK.asn1.-P b/tests/93-asn1c-controls-OK.asn1.-P index d778a7b6..429b41b4 100644 --- a/tests/93-asn1c-controls-OK.asn1.-P +++ b/tests/93-asn1c-controls-OK.asn1.-P @@ -289,7 +289,7 @@ asn_TYPE_descriptor_t asn_DEF_setof_2 = { static asn_TYPE_member_t asn_MBR_Choice_1[] = { { ATF_POINTER, 0, offsetof(struct Choice, choice.setof), .tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)), - .tag_mode = -1, /* IMPLICIT tag at current level */ + .tag_mode = 0, .type = &asn_DEF_setof_2, .memb_constraints = 0, /* Defer constraints checking to the member type */ .per_constraints = 0, /* PER is not compiled, use -gen-PER */