Commit 2c34aad7 authored by Lev Walkin's avatar Lev Walkin

strict character set

parent d307c366
...@@ -266,7 +266,8 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_byte ...@@ -266,7 +266,8 @@ OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st, asn_app_consume_byte
static enum xer_pbd_rval 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__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; 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 s_arcs[10];
long *arcs = s_arcs; long *arcs = s_arcs;
int arcs_count; int arcs_count;
...@@ -281,6 +282,11 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const ...@@ -281,6 +282,11 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const
/* Expecting more than zero arcs */ /* Expecting more than zero arcs */
return XPBD_BROKEN_ENCODING; 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])) { if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
arcs = (long *)MALLOC(arcs_count * sizeof(long)); arcs = (long *)MALLOC(arcs_count * sizeof(long));
...@@ -296,10 +302,9 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const ...@@ -296,10 +302,9 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const
* Convert arcs into BER representation. * Convert arcs into BER representation.
*/ */
ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, sizeof(*arcs), arcs_count); ret = OBJECT_IDENTIFIER_set_arcs(st, arcs, sizeof(*arcs), arcs_count);
if(ret) return XPBD_BROKEN_ENCODING;
if(arcs != s_arcs) FREEMEM(arcs); if(arcs != s_arcs) FREEMEM(arcs);
return XPBD_BODY_CONSUMED; return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED;
} }
asn_dec_rval_t asn_dec_rval_t
...@@ -648,7 +653,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar ...@@ -648,7 +653,7 @@ OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, void *arcs, unsigned int ar
int int
OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, 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; unsigned int arcs_count = 0;
const char *oid_end; const char *oid_end;
long value = 0; long value = 0;
...@@ -659,7 +664,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, ...@@ -659,7 +664,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
} state = ST_SKIPSPACE; } state = ST_SKIPSPACE;
if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { 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; errno = EINVAL;
return -1; return -1;
} }
...@@ -711,7 +716,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, ...@@ -711,7 +716,7 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
} /* for() */ } /* for() */
if(oid_text_end) *(const char **)oid_text_end = oid_text; if(oid_text_end) *oid_text_end = oid_text;
/* Finalize last arc */ /* Finalize last arc */
switch(state) { switch(state) {
......
/*- /*-
* 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. * Redistribution and modifications are permitted subject to BSD license.
*/ */
#ifndef _OBJECT_IDENTIFIER_H_ #ifndef _OBJECT_IDENTIFIER_H_
...@@ -116,7 +117,7 @@ ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add, ...@@ -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. * This is useful for (_arc_slots) value estimation.
*/ */
int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, 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. * Internal functions.
......
/*- /*-
* 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. * Redistribution and modifications are permitted subject to BSD license.
*/ */
#include <asn_internal.h> #include <asn_internal.h>
...@@ -89,7 +90,8 @@ RELATIVE_OID_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, ...@@ -89,7 +90,8 @@ RELATIVE_OID_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
static enum xer_pbd_rval 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__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; 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 s_arcs[6];
long *arcs = s_arcs; long *arcs = s_arcs;
int arcs_count; int arcs_count;
...@@ -104,6 +106,11 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void ...@@ -104,6 +106,11 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void
/* Expecting at least zero arcs */ /* Expecting at least zero arcs */
return XPBD_BROKEN_ENCODING; 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])) { if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
arcs = (long *)MALLOC(arcs_count * sizeof(long)); 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 ...@@ -119,10 +126,9 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void
* Convert arcs into BER representation. * Convert arcs into BER representation.
*/ */
ret = RELATIVE_OID_set_arcs(st, arcs, sizeof(*arcs), arcs_count); ret = RELATIVE_OID_set_arcs(st, arcs, sizeof(*arcs), arcs_count);
if(ret) return XPBD_BROKEN_ENCODING;
if(arcs != s_arcs) FREEMEM(arcs); if(arcs != s_arcs) FREEMEM(arcs);
return XPBD_BODY_CONSUMED; return ret ? XPBD_SYSTEM_FAILURE : XPBD_BODY_CONSUMED;
} }
asn_dec_rval_t asn_dec_rval_t
......
...@@ -226,7 +226,7 @@ check_speed() { ...@@ -226,7 +226,7 @@ check_speed() {
static void check_parse(const char *oid_txt, int retval) { static void check_parse(const char *oid_txt, int retval) {
int ret; int ret;
long l[2]; long l[2];
char *p; const char *p;
ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, l, 2, &p); ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, l, 2, &p);
printf("[%s] => %d == %d\n", oid_txt, ret, retval); printf("[%s] => %d == %d\n", oid_txt, ret, retval);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment