diff options
author | Lev Walkin <vlm@lionet.info> | 2004-08-13 12:35:29 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-08-13 12:35:29 +0000 |
commit | 26b6e0471c5f0c07064b1ac31be9e07c38bab90e (patch) | |
tree | 41c3de9624231b0b0ee75c982e58972c143aa98f /libasn1parser/asn1p_constr.c | |
parent | b4fcdd2e63b85346e59e85d2e36889f0ac3c2781 (diff) |
proper cloning
Diffstat (limited to 'libasn1parser/asn1p_constr.c')
-rw-r--r-- | libasn1parser/asn1p_constr.c | 19 |
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; |