8 #define ADVANCE(num_bytes) do { \ 9 size_t num = num_bytes; \ 10 ptr = ((const char *)ptr) + num; \ 12 consumed_myself += num; \ 15 #define RETURN(_code) do { \ 16 asn_dec_rval_t rval; \ 18 if(opt_ctx) opt_ctx->step = step; \ 19 if(_code == RC_OK || opt_ctx) \ 20 rval.consumed = consumed_myself; \ 32 void **struct_ptr,
const void *ptr,
size_t size) {
41 s_codec_ctx = *opt_codec_ctx;
42 opt_codec_ctx = &s_codec_ctx;
46 memset(&s_codec_ctx, 0,
sizeof(s_codec_ctx));
48 opt_codec_ctx = &s_codec_ctx;
67 const void *ptr,
size_t size,
int tag_mode,
int last_tag_form,
69 ssize_t consumed_myself = 0;
75 int expect_00_terminators = 0;
77 int step = opt_ctx ? opt_ctx->
step : 0;
111 ASN_DEBUG(
"ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)",
112 td->
name, (
long)size, tag_mode, step, tagno);
115 if(tag_mode == 0 && tagno == td->
tags_count) {
128 (
const char *)ptr + tag_len, size - tag_len, &tlv_len);
134 (
long)(tag_len + len_len));
137 assert(tagno < td->tags_count);
139 for((
void)tagno; tagno < td->
tags_count; tagno++, step++) {
146 "len %ld, step %d, tagno %d got %s",
148 (
long)tag_len, step, tagno,
161 if(tag_mode != 0 && step == 0) {
169 if(tlv_tag != td->
tags[tagno]) {
174 "expectation failed (tn=%d, tm=%d)",
190 if(tlv_constr == 0) {
196 if(last_tag_form != tlv_constr
197 && last_tag_form != -1) {
199 last_tag_form, tlv_constr);
208 (
const char *)ptr + tag_len, size - tag_len, &tlv_len);
209 ASN_DEBUG(
"Fetching len = %ld", (
long)len_len);
226 if(limit_len == -1) {
227 expect_00_terminators++;
229 ASN_DEBUG(
"Unexpected indefinite length " 230 "in a chain of definite lengths");
236 if(expect_00_terminators) {
238 "in a chain of indefinite lengths");
247 if(limit_len == -1) {
248 limit_len = tlv_len + tag_len + len_len;
253 }
else if(limit_len != tlv_len + tag_len + len_len) {
258 ASN_DEBUG(
"Outer TLV is %ld and inner is %ld",
259 (
long)limit_len, (
long)tlv_len);
265 limit_len -= (tag_len + len_len);
266 if((ssize_t)size > limit_len) {
276 *opt_tlv_form = tlv_constr;
277 if(expect_00_terminators)
278 *last_length = -expect_00_terminators;
280 *last_length = tlv_len;
#define _ASN_DEFAULT_STACK_MAX
ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r)
#define BER_TLV_CONSTRUCTED(tagptr)
ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, ber_tlv_len_t *len_r)
char * ber_tlv_tag_string(ber_tlv_tag_t tag)
static int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx)
asn_dec_rval_t ber_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, const void *ptr, size_t size)
static void ASN_DEBUG(const char *fmt,...)
ber_type_decoder_f * ber_decoder
asn_TYPE_descriptor_t * type_descriptor
asn_dec_rval_t ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form)
#define ADVANCE(num_bytes)