diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index f8adc753f25a16b197f0dc1ec0c1958bdef12950..e2f2434a8a995b1bb85df2b7188da9530d61df48 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -36,17 +36,28 @@ static int asn1f_fix_bit_string_type(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; + int r_value = 0; + int ret; TQ_FOR(v, &(expr->members), next) { + /* Check identifier uniqueness as per 21.4 */ + ret = asn1f_check_unique_expr_child(arg, v, 0); + RET2RVAL(ret, r_value); + + if(v->expr_type == A1TC_EXTENSIBLE) { + FATAL("Extension marker (...) is not allowed " + "as a BIT STRING NamedBit at line %d ", + v->_lineno); + return -1; + } if(v->expr_type != A1TC_UNIVERVAL) { FATAL("BIT STRING value at line %d " - "is not an identifier", - v->_lineno); + "is not an identifier", v->_lineno); return -1; } } - return 0; + return r_value; } static int diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index ce2fc2fc646a4cb347392dc94bed7dac915f07f5..cf03914f5c53081cb9749fbd28f6b0521ea70e36 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -34,8 +34,7 @@ asn1f_fix_enum(arg_t *arg) { */ if(ev->expr_type == A1TC_EXTENSIBLE) { if(ext_marker) { - arg->eh(1, - "Enumeration %s at line %d: " + FATAL("Enumeration %s at line %d: " "Second extension marker is not allowed", expr->Identifier, ev->_lineno); diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 8a144911803f189c5e2eb68e48b821d83e0d80f6..0302acd25d80f8199e78ae1554166059180f2e6d 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -38,20 +38,17 @@ asn1f_fix_integer(arg_t *arg) { * Found "...", check correctness. */ if(iv->expr_type == A1TC_EXTENSIBLE) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Extension marker is not allowed", expr->Identifier, - iv->_lineno - ); + iv->_lineno); rvalue = -1; continue; } if(iv->Identifier == NULL || iv->expr_type != A1TC_UNIVERVAL) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Unsupported enumeration element %s", expr->Identifier, iv->_lineno, @@ -62,8 +59,7 @@ asn1f_fix_integer(arg_t *arg) { } if(iv->value == NULL) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Value for the identifier %s " "must be set explicitly", expr->Identifier, @@ -84,8 +80,7 @@ asn1f_fix_integer(arg_t *arg) { } if(iv->value->type != ATV_INTEGER) { - arg->eh(1, - "INTEGER %s at line %d: " + FATAL("INTEGER %s at line %d: " "Value for the identifier %s " "is not compatible with INTEGER type", expr->Identifier, diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 72317aa24edb293a92b91fd65e9d8fcb728cbece..9e8cc07fbec78217a13d9215c508bf985a8d49c9 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -294,8 +294,7 @@ asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, msg = opt_compare ?"Expressions clash" :"Identifiers name clash"; - arg->eh(1, - "%s: " + FATAL("%s: " "\"%s\" at line %d has similar %s with " "\"%s\" at line %d", msg, diff --git a/tests/113-bit-string-SE.asn1 b/tests/113-bit-string-SE.asn1 new file mode 100644 index 0000000000000000000000000000000000000000..110e7644d623023b84201016839b78eae474235e --- /dev/null +++ b/tests/113-bit-string-SE.asn1 @@ -0,0 +1,16 @@ + +-- SE: Semantic error + +-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1) +-- .spelio.software.asn1c.test (9363.1.5.1) +-- .113 + +ModuleBitStringExtensibility + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 113 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), one(2) } + +END