From 2b6f4ff7d0162bd496dba45e20e1eb1e3bf67ec9 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 23 Apr 2003 11:52:22 +0000 Subject: [PATCH] Fix byte-ordering in bdb_dup_compare --- servers/slapd/back-bdb/dn2id.c | 35 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/servers/slapd/back-bdb/dn2id.c b/servers/slapd/back-bdb/dn2id.c index 51a5edc8fe..88b468e6e9 100644 --- a/servers/slapd/back-bdb/dn2id.c +++ b/servers/slapd/back-bdb/dn2id.c @@ -512,28 +512,21 @@ bdb_dup_compare( const DBT *curkey ) { - diskNode *usr = usrkey->data; - diskNode *cur = curkey->data; - short curlen, usrlen; - char *ptr; - unsigned char *pt2; - int rc; - - /* Make sure to detect negative values in the nrdnlen */ - ptr = (char *)&usr->nrdnlen; - pt2 = (unsigned char *)(ptr+1); - - usrlen = ptr[0] << 8 | *pt2; - - ptr = (char *)&cur->nrdnlen; - pt2 = (unsigned char *)(ptr+1); - - curlen = ptr[0] << 8 | *pt2; + char *u = (char *)&(((diskNode *)(usrkey->data))->nrdnlen); + char *c = (char *)&(((diskNode *)(curkey->data))->nrdnlen); + int rc, i; - rc = usrlen - curlen; - - if ( rc == 0 ) rc = strncmp( usr->nrdn, cur->nrdn, usrlen ); - return rc; + /* data is not aligned, cannot compare directly */ +#ifdef WORDS_BIGENDIAN + for( i = 0; i < (int)sizeof(short); i++) +#else + for( i = sizeof(short)-1; i >= 0; i--) +#endif + { + rc = u[i] - c[i]; + if( rc ) return rc; + } + return strcmp( u+sizeof(short), c+sizeof(short) ); } /* This function constructs a full DN for a given entry. -- 2.39.2