changeset 76:419c158636e2

Fix bug in octetstring handling
author Sebastien Decugis <sdecugis@nict.go.jp>
date Fri, 11 Jul 2008 14:00:33 +0900
parents d3deb0097ab8
children 425b707d20bb
files include/waaad/dictionary-api.h waaad/dictionary.c
diffstat 2 files changed, 12 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/include/waaad/dictionary-api.h	Fri Jul 11 12:03:42 2008 +0900
+++ b/include/waaad/dictionary-api.h	Fri Jul 11 14:00:33 2008 +0900
@@ -431,8 +431,8 @@
 /* Type to store any AVP value */ 
 typedef union {
 	struct {
-		char *	 data;
-		size_t   len;
+		unsigned char *	data;	/* bytes buffer */
+		size_t   	len;	/* length of the data buffer */
 	}           os;		/* Storage for an octet string, data is alloc'd and must be freed */
 	int32_t     i32;	/* integer 32 */
 	int64_t     i64;	/* integer 64 */
--- a/waaad/dictionary.c	Fri Jul 11 12:03:42 2008 +0900
+++ b/waaad/dictionary.c	Fri Jul 11 14:00:33 2008 +0900
@@ -551,7 +551,7 @@
 			oslen = o1->data.type_enum.enum_value.os.len;
 			if (o2->data.type_enum.enum_value.os.len < oslen)
 				oslen = o2->data.type_enum.enum_value.os.len;
-			cmp = strncmp(o1->data.type_enum.enum_value.os.data, o2->data.type_enum.enum_value.os.data, oslen );
+			cmp = memcmp(o1->data.type_enum.enum_value.os.data, o2->data.type_enum.enum_value.os.data, oslen );
 			return (cmp ? cmp : order_scalar(o1->data.type_enum.enum_value.os.len,o2->data.type_enum.enum_value.os.len));
 		
 		case AVP_TYPE_INTEGER32:
@@ -664,19 +664,23 @@
 	}									\
 	ret = ENOENT;								\
 }
-/* For search of octet strings in lists (not \0 terminated). */
+/* For search of octetstrings in lists (not \0 terminated). */
 #define SEARCH_ocstring( ostr, length, sentinel, osdatafield, isindex ) {	\
-	char * __ostr = (char *) ostr;						\
+	unsigned char * __ostr = (unsigned char *) ostr;			\
 	int __cmp;								\
 	size_t __len;								\
 	_dict_list_t * __li;							\
 	for  (__li = (sentinel); __li->next != (sentinel); __li = __li->next) {	\
 		__len = __li->next->o->data. osdatafield .len;			\
-		if ( __len > length )						\
-			__len = length;						\
-		__cmp = strncmp(__ostr, 					\
+		if ( __len > (length) )						\
+			__len = (length);					\
+		__cmp = memcmp(__ostr, 						\
 				__li->next->o->data. osdatafield .data, 	\
 				__len);						\
+		if (! __cmp) {							\
+			__cmp = order_scalar( length,				\
+					__li->next->o->data. osdatafield .len); \
+		}								\
 		if (__cmp == 0) {						\
 			if (result)						\
 				*result = __li->next->o;			\
"Welcome to our mercurial repository"