diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 05118682fe6a1c28cf8411417b0cfedd74e206f9..8d2317f49d252c04f49ba58b5058a90a19bef74e 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -385,7 +385,7 @@ asn1f_fix_constructed(arg_t *arg) { } /* Check identifier distinctness */ - ret = asn1f_check_unique_expr(arg, NULL); + ret = asn1f_check_unique_expr(arg); RET2RVAL(ret, rvalue); /* Fix extensibility */ diff --git a/libasn1fix/asn1fix_bitstring.c b/libasn1fix/asn1fix_bitstring.c index f3d5ad7314cf842f384fdd5580cfa327b6d6266b..5f30ea4f9cf7eeee2fd77771b7759ba70830b214 100644 --- a/libasn1fix/asn1fix_bitstring.c +++ b/libasn1fix/asn1fix_bitstring.c @@ -32,6 +32,10 @@ asn1f_fix_bit_string(arg_t *arg) { return r_value; } +static int _compare_value(asn1p_expr_t *expr1, asn1p_expr_t *expr2) { + return expr2->value->value.v_integer - expr1->value->value.v_integer; +} + static int asn1f_fix_bit_string_type(arg_t *arg) { asn1p_expr_t *expr = arg->expr; @@ -40,10 +44,6 @@ asn1f_fix_bit_string_type(arg_t *arg) { 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 ", @@ -74,6 +74,14 @@ asn1f_fix_bit_string_type(arg_t *arg) { v->_lineno); return -1; } + + /* Check value uniqueness as per 21.4 */ + ret = asn1f_check_unique_expr_child(arg, v, + _compare_value, "value"); + RET2RVAL(ret, r_value); + /* Check identifier uniqueness as per 21.5 */ + ret = asn1f_check_unique_expr_child(arg, v, 0, "identifier"); + RET2RVAL(ret, r_value); } return r_value; diff --git a/libasn1fix/asn1fix_enum.c b/libasn1fix/asn1fix_enum.c index cf03914f5c53081cb9749fbd28f6b0521ea70e36..570d23ae18d8d10de392014997340f53b6f19b89 100644 --- a/libasn1fix/asn1fix_enum.c +++ b/libasn1fix/asn1fix_enum.c @@ -119,7 +119,7 @@ asn1f_fix_enum(arg_t *arg) { * 1.4 Check that all identifiers before the current one * differs from it. */ - ret = asn1f_check_unique_expr_child(arg, ev, NULL); + ret = asn1f_check_unique_expr_child(arg, ev, 0, "identifier"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_integer.c b/libasn1fix/asn1fix_integer.c index 0302acd25d80f8199e78ae1554166059180f2e6d..a5d0b6e7487f947a16b6f035d522218d4c3b1867 100644 --- a/libasn1fix/asn1fix_integer.c +++ b/libasn1fix/asn1fix_integer.c @@ -92,12 +92,13 @@ asn1f_fix_integer(arg_t *arg) { /* * Check that all identifiers are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, NULL); + ret = asn1f_check_unique_expr_child(arg, iv, 0, "identifier"); RET2RVAL(ret, rvalue); /* * Check that all values are distinct. */ - ret = asn1f_check_unique_expr_child(arg, iv, _compare_value); + ret = asn1f_check_unique_expr_child(arg, iv, + _compare_value, "value"); RET2RVAL(ret, rvalue); } diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c index 9e8cc07fbec78217a13d9215c508bf985a8d49c9..4af0fd8c5989ace04d63cdd0755f554f7914075d 100644 --- a/libasn1fix/asn1fix_misc.c +++ b/libasn1fix/asn1fix_misc.c @@ -236,15 +236,14 @@ asn1f_recurse_expr(arg_t *arg, int (*callback)(arg_t *arg)) { * Check that every child of a given expr has unique name or does not have any. */ int -asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { +asn1f_check_unique_expr(arg_t *arg) { asn1p_expr_t *expr; int rvalue = 0; TQ_FOR(expr, &(arg->expr->members), next) { if(expr->Identifier) { int ret = asn1f_check_unique_expr_child(arg, expr, - opt_compare); + 0, "identifier"); if(ret) rvalue = -1; } else { /* @@ -263,9 +262,11 @@ asn1f_check_unique_expr(arg_t *arg, */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)) { + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name) { asn1p_expr_t *expr; - int rvalue = 0; + + if(!opt_property_name) opt_property_name = "property"; assert(child); assert(opt_compare || child->Identifier); @@ -290,26 +291,20 @@ asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, } if(ret == 0) { - char *msg; - msg = opt_compare - ?"Expressions clash" - :"Identifiers name clash"; - FATAL("%s: " + FATAL("Clash detected: " "\"%s\" at line %d has similar %s with " "\"%s\" at line %d", - msg, expr->Identifier, expr->_lineno, - opt_compare?"property":"name", + opt_property_name, child->Identifier, child->_lineno ); - - rvalue = -1; + return -1; } } - return rvalue; + return 0; } int diff --git a/libasn1fix/asn1fix_misc.h b/libasn1fix/asn1fix_misc.h index a90c5bedb413647a00c6dfa09fbc25c07039a832..6dcd220d1bbbec6230c779a49b57aa62f885b041 100644 --- a/libasn1fix/asn1fix_misc.h +++ b/libasn1fix/asn1fix_misc.h @@ -11,12 +11,9 @@ int asn1f_recurse_expr(arg_t *arg, int (*f)(arg_t *arg)); /* - * Check that every child of a given expr has unique name or does not have any. - * If opt_compare == NULL, the default comparison of the argument's - * names (identifiers) will be performed. + * Check that every child of a given expr has unique identifier. */ -int asn1f_check_unique_expr(arg_t *arg, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); +int asn1f_check_unique_expr(arg_t *arg); /* * Check that every preceeding child of the given expr is not @@ -25,7 +22,8 @@ int asn1f_check_unique_expr(arg_t *arg, * names (identifiers) will be performed. */ int asn1f_check_unique_expr_child(arg_t *arg, asn1p_expr_t *child, - int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b)); + int (*opt_compare)(asn1p_expr_t *a, asn1p_expr_t *b), + const char *opt_property_name); /* * Return number of children. diff --git a/tests/116-bit-string-SE.asn1 b/tests/116-bit-string-SE.asn1 new file mode 100644 index 0000000000000000000000000000000000000000..f5967c04105bdcb59b3f8ef84778c6e9dfa53ffc --- /dev/null +++ b/tests/116-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) +-- .116 + +ModuleBitStringSameValues + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 116 } + DEFINITIONS ::= +BEGIN + + T ::= BIT STRING { one(1), another(1) } + +END