asn1: Add error checking for open types
This commit is contained in:
@@ -767,8 +767,10 @@ define_asn1 (int level, Type *t)
|
|||||||
fprintf(headerfile, "%s.&%s",
|
fprintf(headerfile, "%s.&%s",
|
||||||
t->typeref.iosclass->symbol->name,
|
t->typeref.iosclass->symbol->name,
|
||||||
t->typeref.field->name);
|
t->typeref.field->name);
|
||||||
} else
|
} else if (t->symbol)
|
||||||
fprintf(headerfile, "%s", t->symbol->name);
|
fprintf(headerfile, "%s", t->symbol->name);
|
||||||
|
else
|
||||||
|
abort();
|
||||||
break;
|
break;
|
||||||
case TInteger:
|
case TInteger:
|
||||||
if(t->members == NULL) {
|
if(t->members == NULL) {
|
||||||
@@ -1032,6 +1034,10 @@ get_open_type_defn_fields(const Type *t,
|
|||||||
subtype->constraint->u.content.type->constraint &&
|
subtype->constraint->u.content.type->constraint &&
|
||||||
subtype->constraint->u.content.type->constraint->ctype == CT_TABLE_CONSTRAINT) {
|
subtype->constraint->u.content.type->constraint->ctype == CT_TABLE_CONSTRAINT) {
|
||||||
/* Type like OCTET STRING or BIT STRING CONTAINING open type */
|
/* Type like OCTET STRING or BIT STRING CONTAINING open type */
|
||||||
|
if (*opentypemember)
|
||||||
|
errx(1, "Multiple open type members %s and %s for the same "
|
||||||
|
"field %s?", (*opentypemember)->name, m->name,
|
||||||
|
(*opentypefield)->name);
|
||||||
*opentypemember = m;
|
*opentypemember = m;
|
||||||
*opentypefield = subtype->constraint->u.content.type->typeref.field;
|
*opentypefield = subtype->constraint->u.content.type->typeref.field;
|
||||||
*is_array_of = sOfType != NULL;
|
*is_array_of = sOfType != NULL;
|
||||||
@@ -1039,6 +1045,10 @@ get_open_type_defn_fields(const Type *t,
|
|||||||
break;
|
break;
|
||||||
} else if (subtype->symbol && strcmp(subtype->symbol->name, "HEIM_ANY") == 0) {
|
} else if (subtype->symbol && strcmp(subtype->symbol->name, "HEIM_ANY") == 0) {
|
||||||
/* Open type, but NOT embedded in OCTET STRING or BIT STRING */
|
/* Open type, but NOT embedded in OCTET STRING or BIT STRING */
|
||||||
|
if (*opentypemember)
|
||||||
|
errx(1, "Multiple open type members %s and %s for the same "
|
||||||
|
"field %s?", (*opentypemember)->name, m->name,
|
||||||
|
(*opentypefield)->name);
|
||||||
*opentypemember = m;
|
*opentypemember = m;
|
||||||
*opentypefield = subtype->typeref.field;
|
*opentypefield = subtype->typeref.field;
|
||||||
*is_array_of = sOfType != NULL;
|
*is_array_of = sOfType != NULL;
|
||||||
@@ -1046,6 +1056,10 @@ get_open_type_defn_fields(const Type *t,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!idmembername)
|
||||||
|
errx(1, "Missing open type id member in %s",
|
||||||
|
t->symbol ? t->symbol->name : "<unknown type>");
|
||||||
/* Look for the type ID member identified in the previous loop */
|
/* Look for the type ID member identified in the previous loop */
|
||||||
HEIM_TAILQ_FOREACH(m, t->members, members) {
|
HEIM_TAILQ_FOREACH(m, t->members, members) {
|
||||||
if (!m->type->subtype || strcmp(m->name, idmembername) != 0)
|
if (!m->type->subtype || strcmp(m->name, idmembername) != 0)
|
||||||
@@ -1179,11 +1193,12 @@ define_type(int level, const char *name, const char *basename, Type *pt, Type *t
|
|||||||
define_open_type(level, newbasename, name, basename, t, t);
|
define_open_type(level, newbasename, name, basename, t, t);
|
||||||
} else if (!t->symbol && pt->actual_parameter) {
|
} else if (!t->symbol && pt->actual_parameter) {
|
||||||
define_open_type(level, newbasename, name, basename, pt, t);
|
define_open_type(level, newbasename, name, basename, pt, t);
|
||||||
} else {
|
} else if (t->symbol) {
|
||||||
fprintf(headerfile, "%s %s;\n", t->symbol->gen_name, name);
|
fprintf(headerfile, "%s %s;\n", t->symbol->gen_name, name);
|
||||||
fprintf(jsonfile, "\"ttype\":\"%s\","
|
fprintf(jsonfile, "\"ttype\":\"%s\","
|
||||||
"\"alias\":true\n", t->symbol->gen_name);
|
"\"alias\":true\n", t->symbol->gen_name);
|
||||||
}
|
} else
|
||||||
|
abort();
|
||||||
break;
|
break;
|
||||||
case TInteger:
|
case TInteger:
|
||||||
if (t->symbol && t->symbol->emitted_definition)
|
if (t->symbol && t->symbol->emitted_definition)
|
||||||
|
Reference in New Issue
Block a user