mirror of https://gerrit.osmocom.org/asn1c
strict character set
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@789 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
parent
be7a532f66
commit
31feaf30eb
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue