diff options
author | Lev Walkin <vlm@lionet.info> | 2005-08-22 14:19:28 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2005-08-22 14:19:28 +0000 |
commit | ac58933ce00c12f60d854bf542bb772fad06072c (patch) | |
tree | 69f86f29d58ec857377d25f900457103194e3f5f /skeletons/constr_SEQUENCE.c | |
parent | 4696c74b7255861ae5c01b4f59168c91c1f36145 (diff) |
change in optionality handling resulted in stricter controls
Diffstat (limited to 'skeletons/constr_SEQUENCE.c')
-rw-r--r-- | skeletons/constr_SEQUENCE.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index aefd94b5..7dcb5da1 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -506,7 +506,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ asn_enc_rval_t SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, - void *ptr, int tag_mode, ber_tlv_tag_t tag, + void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; asn_enc_rval_t erval; @@ -523,10 +523,14 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); - if(!memb_ptr) continue; + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Mandatory element is missing */ + _ASN_ENCODE_FAILED; + } } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, @@ -543,12 +547,8 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, */ ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); - if(ret == -1) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } + if(ret == -1) + _ASN_ENCODE_FAILED; erval.encoded = computed_size + ret; if(!cb) return erval; @@ -562,10 +562,10 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *memb_ptr; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } tmperval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, @@ -577,14 +577,11 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, edx, elm->name, td->name, (long)tmperval.encoded); } - if(computed_size != 0) { + if(computed_size != 0) /* * Encoded size is not equal to the computed size. */ - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - } + _ASN_ENCODE_FAILED; return erval; } @@ -862,7 +859,12 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; /* OPTIONAL element? */ + if(!memb_ptr) { + if(elm->optional) + continue; + /* Mandatory element is missing */ + _ASN_ENCODE_FAILED; + } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } @@ -905,7 +907,11 @@ SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; + if(!memb_ptr) { + if(elm->optional) continue; + /* Print <absent> line */ + /* Fall through */ + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } @@ -978,7 +984,14 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; + if(!memb_ptr) { + if(elm->optional) + continue; + _ASN_ERRLOG(app_errlog, app_key, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } |