Mercurial > hg > waaad
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; \