remove extensions from the beginning of serially applied constraint
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1235 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c
index 7477d72..847bdce 100644
--- a/libasn1fix/asn1fix_constraint.c
+++ b/libasn1fix/asn1fix_constraint.c
@@ -2,7 +2,7 @@
#include "asn1fix_constraint.h"
#include "asn1fix_crange.h"
-static void _remove_extensions(arg_t *arg, asn1p_constraint_t *ct);
+static void _remove_extensions(arg_t *arg, asn1p_constraint_t *ct, int flast);
static int constraint_type_resolve(arg_t *arg, asn1p_constraint_t *ct);
static int constraint_value_resolve(arg_t *arg, asn1p_value_t **value, enum asn1p_constraint_type_e real_ctype);
@@ -102,7 +102,7 @@
/*
* If we have a parent, remove all the extensions (46.4).
*/
- _remove_extensions(arg, ct_parent);
+ _remove_extensions(arg, ct_parent, 0);
expr->combined_constraints = ct_parent;
if(ct_expr->type == ACT_CA_SET) {
@@ -125,6 +125,7 @@
ct_expr);
}
} else {
+ _remove_extensions(arg, ct_expr, 1);
expr->combined_constraints = ct_expr;
}
@@ -227,13 +228,18 @@
}
static void
-_remove_extensions(arg_t *arg, asn1p_constraint_t *ct) {
+_remove_extensions(arg_t *arg, asn1p_constraint_t *ct, int forgive_last) {
unsigned int i;
+ if(!ct) return;
+
for(i = 0; i < ct->el_count; i++) {
if(ct->elements[i]->type == ACT_EL_EXT)
break;
- _remove_extensions(arg, ct->elements[i]);
+ if(forgive_last && ct->type == ACT_CA_SET
+ && i + 1 == ct->el_count)
+ return;
+ _remove_extensions(arg, ct->elements[i], 0);
}
/* Remove the elements at and after the extensibility mark */
@@ -288,7 +294,7 @@
ct_expr = asn1p_constraint_clone(ct_expr);
assert(ct_expr);
- _remove_extensions(arg, ct_expr);
+ _remove_extensions(arg, ct_expr, 0);
if(ct_expr->type == ACT_CA_SET) {
unsigned int i;