Commit ac58933c authored by Lev Walkin's avatar Lev Walkin

change in optionality handling resulted in stricter controls

parent 4696c74b
......@@ -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;
}
......
......@@ -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);
}
......
/*-
* 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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment