aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-08-22 14:19:28 +0000
committerLev Walkin <vlm@lionet.info>2005-08-22 14:19:28 +0000
commitac58933ce00c12f60d854bf542bb772fad06072c (patch)
tree69f86f29d58ec857377d25f900457103194e3f5f /skeletons
parent4696c74b7255861ae5c01b4f59168c91c1f36145 (diff)
change in optionality handling resulted in stricter controls
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/constr_CHOICE.c31
-rw-r--r--skeletons/constr_SEQUENCE.c53
-rw-r--r--skeletons/constr_SET.c19
3 files changed, 59 insertions, 44 deletions
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index e49bc1af..b3af333a 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -353,8 +353,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
}
asn_enc_rval_t
-CHOICE_encode_der(asn_TYPE_descriptor_t *td,
- void *struct_ptr,
+CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
int tag_mode, ber_tlv_tag_t tag,
asn_app_consume_bytes_f *cb, void *app_key) {
asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics;
@@ -367,7 +366,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td,
ASN_DEBUG("%s %s as CHOICE",
cb?"Encoding":"Estimating", td->name);
- present = _fetch_present_idx(struct_ptr,
+ present = _fetch_present_idx(sptr,
specs->pres_offset, specs->pres_size);
/*
@@ -380,10 +379,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td,
erval.encoded = 0;
return erval;
}
- erval.encoded = -1;
- erval.failed_type = td;
- erval.structure_ptr = struct_ptr;
- return erval;
+ _ASN_ENCODE_FAILED;
}
/*
@@ -391,20 +387,17 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td,
*/
elm = &td->elements[present-1];
if(elm->flags & ATF_POINTER) {
- memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset);
+ memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
if(memb_ptr == 0) {
if(elm->optional) {
erval.encoded = 0;
- } else {
- /* Mandatory element absent */
- erval.encoded = -1;
- erval.failed_type = td;
- erval.structure_ptr = struct_ptr;
+ return erval;
}
- return erval;
+ /* Mandatory element absent */
+ _ASN_ENCODE_FAILED;
}
} else {
- memb_ptr = (void *)((char *)struct_ptr + elm->memb_offset);
+ memb_ptr = (void *)((char *)sptr + elm->memb_offset);
}
/*
@@ -427,12 +420,8 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td,
/* Encode CHOICE with parent or my own tag */
ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag,
cb, app_key);
- if(ret == -1) {
- erval.encoded = -1;
- erval.failed_type = td;
- erval.structure_ptr = struct_ptr;
- return erval;
- }
+ if(ret == -1)
+ _ASN_ENCODE_FAILED;
computed_size += ret;
}
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);
}
diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c
index a45d7f9f..f99d66f4 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -1,5 +1,6 @@
/*-
- * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
+ * All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
#include <asn_internal.h>
@@ -477,6 +478,9 @@ SET_encode_der(asn_TYPE_descriptor_t *td,
if(elm->flags & ATF_POINTER) {
memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
if(!memb_ptr) {
+ if(!elm->optional)
+ /* Mandatory elements missing */
+ _ASN_ENCODE_FAILED;
if(t2m_build_own) {
t2m[t2m_count].el_no = edx;
t2m[t2m_count].el_tag = 0;
@@ -827,7 +831,12 @@ SET_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 missing */
+ _ASN_ENCODE_FAILED;
+ }
} else {
memb_ptr = (void *)((char *)sptr + elm->memb_offset);
}
@@ -872,7 +881,11 @@ SET_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);
}