From: Howard Chu Date: Wed, 7 Dec 2005 01:54:50 +0000 (+0000) Subject: ITS#4250 bdb_idl_delete needs to check for Range X-Git-Tag: OPENLDAP_REL_ENG_2_4_BP~631 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=2bb65557268729ab2e25b973e9b3efabe76edaf3;p=openldap ITS#4250 bdb_idl_delete needs to check for Range --- diff --git a/servers/slapd/back-bdb/idl.c b/servers/slapd/back-bdb/idl.c index e034fb2ff8..321e02e232 100644 --- a/servers/slapd/back-bdb/idl.c +++ b/servers/slapd/back-bdb/idl.c @@ -226,7 +226,7 @@ int bdb_idl_insert( ID *ids, ID id ) static int bdb_idl_delete( ID *ids, ID id ) { - unsigned x = bdb_idl_search( ids, id ); + unsigned x; #if IDL_DEBUG > 1 Debug( LDAP_DEBUG_ANY, "delete: %04lx at %d\n", (long) id, x, 0 ); @@ -235,6 +235,23 @@ static int bdb_idl_delete( ID *ids, ID id ) idl_check( ids ); #endif + if (BDB_IDL_IS_RANGE( ids )) { + /* If deleting a range boundary, adjust */ + if ( ids[1] == id ) + ids[1]++; + else if ( ids[2] == id ) + ids[2]--; + /* deleting from inside a range is a no-op */ + + /* If the range has collapsed, re-adjust */ + if ( ids[1] > ids[2] ) + ids[0] = 0; + else if ( ids[1] == ids[2] ) + ids[1] = 1; + return 0; + } + + x = bdb_idl_search( ids, id ); assert( x > 0 ); if( x <= 0 ) {