aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2006-09-21 02:21:53 +0000
committerLev Walkin <vlm@lionet.info>2006-09-21 02:21:53 +0000
commit38d00171e27493432236186df3c63f2403e016be (patch)
tree555f2fcac24848c9e8f968801d8cf0855b25f665 /libasn1fix
parent1bad159a5f08af104d56797acc3c1f79345071ec (diff)
remove extensions from the beginning of serially applied constraint
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix_constraint.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/libasn1fix/asn1fix_constraint.c b/libasn1fix/asn1fix_constraint.c
index 7477d722..847bdcea 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 @@ asn1constraint_pullup(arg_t *arg) {
/*
* 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 @@ asn1constraint_pullup(arg_t *arg) {
ct_expr);
}
} else {
+ _remove_extensions(arg, ct_expr, 1);
expr->combined_constraints = ct_expr;
}
@@ -227,13 +228,18 @@ asn1constraint_resolve(arg_t *arg, asn1p_constraint_t *ct, asn1p_expr_type_e ety
}
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 @@ constraint_type_resolve(arg_t *arg, asn1p_constraint_t *ct) {
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;