diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c
index cb18fbae5cb259f532ed61e7f4154f222a9c4dbb..fa75175acce52af1ff36b722156c7ffef939ea27 100644
--- a/servers/slapd/schema_init.c
+++ b/servers/slapd/schema_init.c
@@ -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;
 	}