diff options
author | Lev Walkin <vlm@lionet.info> | 2007-06-29 11:25:49 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2007-06-29 11:25:49 +0000 |
commit | 55fdd9983fe94b3e0c9bcaa9dcdc767177242c42 (patch) | |
tree | 7583c3c32cad5b53fef897e8fdb6299c29eab97c /skeletons/per_opentype.c | |
parent | 375f0e989019bfe7f03242105a854ba009b21abb (diff) |
simple version of open type decoder completed
Diffstat (limited to 'skeletons/per_opentype.c')
-rw-r--r-- | skeletons/per_opentype.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index 1c3a49a7..2e5a7e11 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -18,6 +18,8 @@ static int uper_ugot_refill(asn_per_data_t *pd); static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); +int asn_debug_indent; + /* * Encode an "open type field". * #10.1, #10.2 @@ -61,10 +63,11 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, size_t bufLen = 0; size_t bufSize = 0; asn_per_data_t spd; + size_t padding; _ASN_STACK_OVERFLOW_CHECK(ctx); - ASN_DEBUG("Getting open type %s from %s", td->name, + ASN_DEBUG("Getting open type %s from %s...", td->name, per_data_string(pd)); do { @@ -90,14 +93,30 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, bufLen += chunk_bytes; } while(repeat); + ASN_DEBUG("Getting open type %s encoded in %d bytes", td->name, + bufLen); + memset(&spd, 0, sizeof(spd)); spd.buffer = buf; spd.nbits = bufLen << 3; + asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); + asn_debug_indent -= 4; FREEMEM(buf); + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", padding); + _ASN_DECODE_FAILED; + } else if(per_get_few_bits(&spd, padding)) { + /* Can't be "no more data", then it's non-zero padding */ + ASN_DEBUG("Non-zero padding"); + _ASN_DECODE_FAILED; + } + return rv; } @@ -121,9 +140,9 @@ uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ pd->moved = 0; /* This now counts the open type size in bits */ - /*asn_debug_indent += 4;*/ + asn_debug_indent += 4; rv = td->uper_decoder(ctx, td, constraints, sptr, pd); - /*asn_debug_indent -= 4;*/ + asn_debug_indent -= 4; #define UPDRESTOREPD do { \ /* buffer and nboff are valid, preserve them. */ \ |