strict character set


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@789 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index eeb9e5f..798929f 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -266,7 +266,8 @@
 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 @@
 		/* 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 @@
 	 * 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 @@
 
 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 @@
 	} 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 @@
 	} /* 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 b1eb267..e32ecef 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 @@
  * 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 6a064d0..97b69f6 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 @@
 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 @@
 		/* 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 @@
 	 * 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 a9066a9..e696d80 100644
--- a/skeletons/tests/check-OIDs.c
+++ b/skeletons/tests/check-OIDs.c
@@ -226,7 +226,7 @@
 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);