X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fidl.c;h=dbcc8f41b7a18eb96df3ff9112b39b427be4a0c5;hb=b0b3eff457f0e431c4fd094d3d9cfeb6383df91d;hp=a3b0e89382b1e84f3e5110ada5cb47a61d4be643;hpb=6939c531700652491f4be4688c6a1f35a1ab8a18;p=openldap diff --git a/servers/slapd/back-ldbm/idl.c b/servers/slapd/back-ldbm/idl.c index a3b0e89382..dbcc8f41b7 100644 --- a/servers/slapd/back-ldbm/idl.c +++ b/servers/slapd/back-ldbm/idl.c @@ -1,8 +1,17 @@ /* idl.c - ldap id list handling routines */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -259,6 +268,8 @@ idl_fetch( } free( (char *) tmp ); + assert( ID_BLOCK_NIDS(idl) == nids ); + #ifdef LDBM_DEBUG_IDL idl_check(idl); #endif @@ -551,14 +562,13 @@ idl_insert_key( #ifndef USE_INDIRECT_NIDS /* select the block to try inserting into *//* XXX linear search XXX */ - for ( i = 0; !ID_BLOCK_NOID(idl, i) && id > ID_BLOCK_ID(idl, i); i++ ) + for ( i = 0; !ID_BLOCK_NOID(idl, i) && id >= ID_BLOCK_ID(idl, i); i++ ) ; /* NULL */ #else i = idl_find(idl, id); - if (ID_BLOCK_ID(idl, i) < id) + if (ID_BLOCK_ID(idl, i) <= id) i++; #endif - if ( i != 0 ) { i--; first = 0; @@ -566,6 +576,11 @@ idl_insert_key( first = 1; } + /* At this point, the following condition must be true: + * ID_BLOCK_ID(idl, i) <= id && id < ID_BLOCK_ID(idl, i+1) + * except when i is the first or the last block. + */ + /* get the block */ cont_alloc( &k2, &key ); cont_id( &k2, ID_BLOCK_ID(idl, i) ); @@ -627,10 +642,11 @@ idl_insert_key( #else if ( !first && (unsigned long)(i + 1) < ID_BLOCK_NIDS(idl) ) { #endif + Datum k3; /* read it in */ - cont_alloc( &k2, &key ); - cont_id( &k2, ID_BLOCK_ID(idl, i + 1) ); - if ( (tmp2 = idl_fetch_one( be, db, k2 )) == NULL ) { + cont_alloc( &k3, &key ); + cont_id( &k3, ID_BLOCK_ID(idl, i + 1) ); + if ( (tmp2 = idl_fetch_one( be, db, k3 )) == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( INDEX, ERR, "idl_insert_key: idl_fetch_one returned NULL\n", 0, 0, 0); @@ -641,7 +657,7 @@ idl_insert_key( #endif /* split the original block */ - cont_free( &k2 ); + cont_free( &k3 ); goto split; } @@ -681,7 +697,7 @@ idl_insert_key( db->dbc_maxids )) ) { case 1: /* id inserted first in block */ rc = idl_change_first( be, db, key, idl, - i + 1, k2, tmp2 ); + i + 1, k3, tmp2 ); /* FALL */ case 2: /* id already there - how? */ @@ -705,6 +721,8 @@ idl_insert_key( idl_free( tmp ); idl_free( tmp2 ); + cont_free( &k3 ); + cont_free( &k2 ); idl_free( idl ); return( 0 ); @@ -713,6 +731,7 @@ idl_insert_key( } idl_free( tmp2 ); + cont_free( &k3 ); } split: