diff options
Diffstat (limited to 'skeletons/per_opentype.c')
-rw-r--r-- | skeletons/per_opentype.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/skeletons/per_opentype.c b/skeletons/per_opentype.c index ec61ae3c..25c6d711 100644 --- a/skeletons/per_opentype.c +++ b/skeletons/per_opentype.c @@ -103,17 +103,24 @@ uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, 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; + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if(padding < 8 && per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", padding); + _ASN_DECODE_FAILED; + } else { + ASN_DEBUG("Non-zero padding"); + _ASN_DECODE_FAILED; + } + } else { + FREEMEM(buf); } return rv; |