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 | |
parent | d307c3669b9d72cb8475031a781bab440fc9c4fd (diff) |
strict character set
-rw-r--r-- | skeletons/OBJECT_IDENTIFIER.c | 17 | ||||
-rw-r--r-- | skeletons/OBJECT_IDENTIFIER.h | 5 | ||||
-rw-r--r-- | skeletons/RELATIVE-OID.c | 14 | ||||
-rw-r--r-- | skeletons/tests/check-OIDs.c | 2 |
4 files changed, 25 insertions, 13 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) { diff --git a/skeletons/OBJECT_IDENTIFIER.h b/skeletons/OBJECT_IDENTIFIER.h index b1eb2677..e32ecefc 100644 --- a/skeletons/OBJECT_IDENTIFIER.h +++ b/skeletons/OBJECT_IDENTIFIER.h @@ -1,5 +1,6 @@ /*- - * 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. */ #ifndef _OBJECT_IDENTIFIER_H_ @@ -116,7 +117,7 @@ ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, * This is useful for (_arc_slots) value estimation. */ 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); /* * Internal functions. diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c index 6a064d03..97b69f60 100644 --- a/skeletons/RELATIVE-OID.c +++ b/skeletons/RELATIVE-OID.c @@ -1,5 +1,6 @@ /*- - * 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> @@ -89,7 +90,8 @@ RELATIVE_OID_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, static enum xer_pbd_rval RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { RELATIVE_OID_t *st = (RELATIVE_OID_t *)sptr; - char *endptr; + const char *chunk_end = (const char *)chunk_buf + chunk_size; + const char *endptr; long s_arcs[6]; long *arcs = s_arcs; int arcs_count; @@ -104,6 +106,11 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void /* Expecting at least 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)); @@ -119,10 +126,9 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void * Convert arcs into BER representation. */ ret = RELATIVE_OID_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 diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index a9066a9b..e696d802 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -226,7 +226,7 @@ check_speed() { static void check_parse(const char *oid_txt, int retval) { int ret; long l[2]; - char *p; + const char *p; ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, l, 2, &p); printf("[%s] => %d == %d\n", oid_txt, ret, retval); |