]> git.sur5r.net Git - openldap/commitdiff
Fix byte-ordering in bdb_dup_compare
authorHoward Chu <hyc@openldap.org>
Wed, 23 Apr 2003 11:52:22 +0000 (11:52 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 23 Apr 2003 11:52:22 +0000 (11:52 +0000)
servers/slapd/back-bdb/dn2id.c

index 51a5edc8fe5b732d465746e3aefe0d94b6a616d5..88b468e6e922333bec015412b3284d064751547a 100644 (file)
@@ -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.