]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_init.c
Sync with HEAD
[openldap] / servers / slapd / schema_init.c
index cb18fbae5cb259f532ed61e7f4154f222a9c4dbb..fa75175acce52af1ff36b722156c7ffef939ea27 100644 (file)
@@ -2119,30 +2119,38 @@ integerVal2Key(
        struct berval *tmp
 )
 {
+       struct berval iv;
        int neg;
 
-       if ( lutil_str2bin( val, tmp )) {
+       iv = *tmp;
+       if ( lutil_str2bin( val, &iv )) {
                return LDAP_INVALID_SYNTAX;
        }
 
-       neg = tmp->bv_val[0] & 0x80;
+       neg = iv.bv_val[0] & 0x80;
+
+       /* Omit leading 0 pad byte */
+       if ( !iv.bv_val[0] ) {
+               iv.bv_val++;
+               iv.bv_len--;
+       }
 
        /* If too small, sign-extend */
-       if ( tmp->bv_len < index_intlen ) {
+       if ( iv.bv_len < index_intlen ) {
                int j, k, pad;
                key->bv_val[0] = index_intlen;
-               k = index_intlen - tmp->bv_len + 1;
+               k = index_intlen - iv.bv_len + 1;
                if ( neg )
                        pad = 0xff;
                else
                        pad = 0;
                for ( j=1; j<k; j++)
                        key->bv_val[j] = pad;
-               for ( j = 0; j<tmp->bv_len; j++ )
-                       key->bv_val[j+k] = tmp->bv_val[j];
+               for ( j = 0; j<iv.bv_len; j++ )
+                       key->bv_val[j+k] = iv.bv_val[j];
        } else {
-               key->bv_val[0] = tmp->bv_len;
-               memcpy( key->bv_val+1, tmp->bv_val, index_intlen );
+               key->bv_val[0] = iv.bv_len;
+               memcpy( key->bv_val+1, iv.bv_val, index_intlen );
        }
        if ( neg ) {
                key->bv_val[0] = -key->bv_val[0];
@@ -2165,7 +2173,7 @@ integerIndexer(
        void *ctx )
 {
        char ibuf[64];
-       struct berval iv, itmp;
+       struct berval itmp;
        BerVarray keys;
        int i, rc;
 
@@ -2196,8 +2204,7 @@ integerIndexer(
                                itmp.bv_val = slap_sl_realloc( itmp.bv_val, itmp.bv_len, ctx );
                        }
                }
-               iv = itmp;
-               rc = integerVal2Key( &values[i], &keys[i], &iv );
+               rc = integerVal2Key( &values[i], &keys[i], &itmp );
                if ( rc )
                        goto leave;
        }