diff options
author | Lev Walkin <vlm@lionet.info> | 2005-03-10 11:50:24 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2005-03-10 11:50:24 +0000 |
commit | 2c34aad7acc52d464a3d5218572ad10ab8fea03b (patch) | |
tree | 600710bd4e3ff14fef380581508b21b50a29e761 /skeletons/OBJECT_IDENTIFIER.c | |
parent | d307c3669b9d72cb8475031a781bab440fc9c4fd (diff) |
strict character set
Diffstat (limited to 'skeletons/OBJECT_IDENTIFIER.c')
-rw-r--r-- | skeletons/OBJECT_IDENTIFIER.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index eeb9e5f2..798929ff 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -266,7 +266,8 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_byte static enum xer_pbd_rval OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)sptr; - char *endptr; + const char *chunk_end = (const char *)chunk_buf + chunk_size; + const char *endptr; long s_arcs[10]; long *arcs = s_arcs; int arcs_count; @@ -281,6 +282,11 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const /* Expecting more than zero arcs */ return XPBD_BROKEN_ENCODING; } + if(endptr < chunk_end) { + /* We have a tail of unrecognized data. Check its safety. */ + if(!xer_is_whitespace(endptr, chunk_end - endptr)) + return XPBD_BROKEN_ENCODING; + } if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) { arcs = (long *)MALLOC(arcs_count * sizeof(long)); @@ -296,10 +302,9 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const * Convert arcs into BER representation. */ ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, sizeof(*arcs), arcs_count); - if(ret) return XPBD_BROKEN_ENCODING; if(arcs != s_arcs) FREEMEM(arcs); - return XPBD_BODY_CONSUMED; + return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED; } asn_dec_rval_t @@ -648,7 +653,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, - long *arcs, unsigned int arcs_slots, char **oid_text_end) { + long *arcs, unsigned int arcs_slots, const char **oid_text_end) { unsigned int arcs_count = 0; const char *oid_end; long value = 0; @@ -659,7 +664,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, } state = ST_SKIPSPACE; if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { - if(oid_text_end) *(const char **)oid_text_end = oid_text; + if(oid_text_end) *oid_text_end = oid_text; errno = EINVAL; return -1; } @@ -711,7 +716,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, } /* for() */ - if(oid_text_end) *(const char **)oid_text_end = oid_text; + if(oid_text_end) *oid_text_end = oid_text; /* Finalize last arc */ switch(state) { |