From c03306fd5e01eae69cc7a9c11604dcc7ce1c43ff Mon Sep 17 00:00:00 2001 From: vlm Date: Sat, 18 Mar 2006 05:06:57 +0000 Subject: [PATCH] references git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1091 59561ff5-6e30-0410-9f3c-9617f08c8826 --- libasn1fix/asn1fix.c | 3 ++- libasn1fix/asn1fix_cws.c | 4 ++-- libasn1fix/asn1fix_dereft.c | 6 +++++- libasn1fix/asn1fix_retrieve.c | 25 +++++++++++++++++++------ skeletons/NativeEnumerated.c | 2 +- skeletons/NativeInteger.c | 2 +- skeletons/NativeReal.c | 2 +- tests/103-reference-SE.asn1 | 16 ++++++++++++++++ 8 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 tests/103-reference-SE.asn1 diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index 21a5621f..d8cc863c 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -477,7 +477,8 @@ asn1f_check_duplicate(arg_t *arg) { "ASN.1 expression \"%s\" at line %d of module %s\n" "clashes with expression \"%s\" at line %d of module %s" "%s%s%s.\n" - "Please rename either instance to resolve the conflict", + "Rename or remove either instance " + "to resolve the conflict", arg->expr->Identifier, arg->expr->_lineno, arg->mod->ModuleName, diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c index 49257945..0279c96d 100644 --- a/libasn1fix/asn1fix_cws.c +++ b/libasn1fix/asn1fix_cws.c @@ -188,7 +188,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i if(isdigit(*p)) { asn1c_integer_t value; if(asn1p_atoi(p, &value)) { - FATAL("Value %s at line %d is too large for this compiler! Please contact the asn1c author.\n", p, arg->expr->_lineno); + FATAL("Value %s at line %d is too large for this compiler! Contact the asn1c author.\n", p, arg->expr->_lineno); return -1; } expr = asn1p_expr_new(arg->expr->_lineno); @@ -197,7 +197,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i expr->expr_type = ASN_BASIC_INTEGER; expr->value = asn1p_value_fromint(value); } else { - WARNING("asn1c is not yet able to parse arbitrary direct values; please convert %s at line %d to a reference.", p, arg->expr->_lineno); + WARNING("asn1c is not yet able to parse arbitrary direct values; try converting %s at line %d to a reference.", p, arg->expr->_lineno); free(p); return 1; } diff --git a/libasn1fix/asn1fix_dereft.c b/libasn1fix/asn1fix_dereft.c index 19af0e8d..769abed9 100644 --- a/libasn1fix/asn1fix_dereft.c +++ b/libasn1fix/asn1fix_dereft.c @@ -29,6 +29,7 @@ asn1f_fix_dereference_types(arg_t *arg) { type_expr = asn1f_find_terminal_type(arg, expr); if(type_expr == NULL) { const char *type_name; + asn1p_expr_t *idexpr; if(errno == EEXIST) { /* Ignore missing type @@ -39,8 +40,11 @@ asn1f_fix_dereference_types(arg_t *arg) { } type_name = asn1f_printable_reference(expr->reference); + /* Avoid NULL in case of unnamed T ::= SEQUENCE OF ... */ + for(idexpr = expr; !idexpr->Identifier && idexpr->parent_expr; + idexpr = idexpr->parent_expr); FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d", - type_name, expr->Identifier, expr->_lineno); + type_name, idexpr->Identifier, expr->_lineno); return -1; } diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 731c269e..2c004be5 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -58,7 +58,8 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { arg->expr->_mark |= TM_BROKEN; FATAL("Cannot find external module \"%s\" " "mentioned for " - "\"%s\" at line %d", + "\"%s\" at line %d. " + "Obtain this module and instruct compiler to process it too.", xp->fromModuleName, name, arg->expr->_lineno); } /* ENOENT/ETOOMANYREFS */ @@ -144,10 +145,8 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { return NULL; } - - -asn1p_expr_t * -asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { +static asn1p_expr_t * +asn1f_lookup_symbol_impl(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref, int recursion_depth) { asn1p_expr_t *ref_tc; /* Referenced tc */ asn1p_module_t *imports_from; char *modulename; @@ -170,6 +169,15 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { mod->ModuleName, ref->_lineno); + if(recursion_depth++ > 30 /* Arbitrary constant */) { + FATAL("Excessive circular referencing detected in module %s for %s at line %d", + mod->ModuleName, + asn1f_printable_reference(ref), + ref->_lineno); + errno = ETOOMANYREFS; + return NULL; + } + if(ref->comp_count == 1) { modulename = NULL; identifier = ref->components[0].name; @@ -247,7 +255,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { assert(tmpref.comp_count > 0); } - expr = asn1f_lookup_symbol(arg, imports_from, &tmpref); + expr = asn1f_lookup_symbol_impl(arg, imports_from, &tmpref, recursion_depth); if(!expr && !(arg->expr->_mark & TM_BROKEN) && !(imports_from->_tags & MT_STANDARD_MODULE)) { arg->expr->_mark |= TM_BROKEN; @@ -326,6 +334,11 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { } +asn1p_expr_t * +asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { + return asn1f_lookup_symbol_impl(arg, mod, ref, 0); +} + asn1p_expr_t * asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) { return asn1f_find_terminal_thing(arg, expr, FTT_TYPE); diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c index e130749f..937accd1 100644 --- a/skeletons/NativeEnumerated.c +++ b/skeletons/NativeEnumerated.c @@ -3,7 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ /* - * Please read the NativeInteger.h for the explanation wrt. differences between + * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c index 2f2b32da..3d1d6b47 100644 --- a/skeletons/NativeInteger.c +++ b/skeletons/NativeInteger.c @@ -3,7 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ /* - * Please read the NativeInteger.h for the explanation wrt. differences between + * Read the NativeInteger.h for the explanation wrt. differences between * INTEGER and NativeInteger. * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * implementation deals with the standard (machine-specific) representation diff --git a/skeletons/NativeReal.c b/skeletons/NativeReal.c index 3e6c2548..34eef231 100644 --- a/skeletons/NativeReal.c +++ b/skeletons/NativeReal.c @@ -3,7 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ /* - * Please read the NativeReal.h for the explanation wrt. differences between + * Read the NativeReal.h for the explanation wrt. differences between * REAL and NativeReal. * Basically, both are decoders and encoders of ASN.1 REAL type, but this * implementation deals with the standard (machine-specific) representation diff --git a/tests/103-reference-SE.asn1 b/tests/103-reference-SE.asn1 new file mode 100644 index 00000000..38cb0aa7 --- /dev/null +++ b/tests/103-reference-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) +-- .102 + +ModuleReference + { iso org(3) dod(6) internet (1) private(4) enterprise(1) + spelio(9363) software(1) asn1c(5) test(1) 102 } + DEFINITIONS ::= +BEGIN + IMPORTS Type FROM ModuleReference; + + T ::= SEQUENCE OF Type +END