aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2004-08-13 12:35:29 +0000
committerLev Walkin <vlm@lionet.info>2004-08-13 12:35:29 +0000
commit26b6e0471c5f0c07064b1ac31be9e07c38bab90e (patch)
tree41c3de9624231b0b0ee75c982e58972c143aa98f
parentb4fcdd2e63b85346e59e85d2e36889f0ac3c2781 (diff)
proper cloning
-rw-r--r--libasn1parser/asn1p_constr.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c
index 6e198892..faec6f2e 100644
--- a/libasn1parser/asn1p_constr.c
+++ b/libasn1parser/asn1p_constr.c
@@ -55,10 +55,29 @@ asn1p_constraint_clone(asn1p_constraint_t *src) {
clone = asn1p_constraint_new(src->_lineno);
if(clone) {
+ int i;
+
clone->type = src->type;
+ clone->presence = src->presence;
CLONE(value, asn1p_value_clone);
CLONE(range_start, asn1p_value_clone);
CLONE(range_stop, asn1p_value_clone);
+
+ for(i = 0; i < src->el_count; i++) {
+ asn1p_constraint_t *t;
+ t = asn1p_constraint_clone(src->elements[i]);
+ if(!t) {
+ asn1p_constraint_free(clone);
+ return NULL;
+ }
+ if(asn1p_constraint_insert(clone, t)) {
+ asn1p_constraint_free(clone);
+ asn1p_constraint_free(t);
+ return NULL;
+ }
+ }
+ assert(clone->el_count == src->el_count);
+ clone->_lineno = src->_lineno;
}
return clone;