aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2006-03-18 05:06:57 +0000
committerLev Walkin <vlm@lionet.info>2006-03-18 05:06:57 +0000
commit41635d33ddf675afa61c742118a197e303930681 (patch)
tree408e6ec46f232629c672a2a53bb2ab8276535f44 /libasn1fix
parentd404427f6e9e07d85785de57a00d815e9af34b7b (diff)
references
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix.c3
-rw-r--r--libasn1fix/asn1fix_cws.c4
-rw-r--r--libasn1fix/asn1fix_dereft.c6
-rw-r--r--libasn1fix/asn1fix_retrieve.c25
4 files changed, 28 insertions, 10 deletions
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;
@@ -327,6 +335,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);
}