X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fdn2id.c;h=683d30a2e56c4019e6c484bb812c0d6d140790ab;hb=573e279d8769b0b74cdf63c21653f261cb741f25;hp=4a7da28731e28b7986fd23473304c9658ea792be;hpb=3ab8c58335b41bdafe01e5a88500807871236b50;p=openldap diff --git a/servers/slapd/back-ldbm/dn2id.c b/servers/slapd/back-ldbm/dn2id.c index 4a7da28731..683d30a2e5 100644 --- a/servers/slapd/back-ldbm/dn2id.c +++ b/servers/slapd/back-ldbm/dn2id.c @@ -11,10 +11,6 @@ #include "back-ldbm.h" #include "proto-back-ldbm.h" -extern struct dbcache *ldbm_cache_open(); -extern char *dn_parent(); -extern Datum ldbm_cache_fetch(); - int dn2id_add( Backend *be, @@ -27,10 +23,8 @@ dn2id_add( Datum key, data; struct ldbminfo *li = (struct ldbminfo *) be->be_private; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); Debug( LDAP_DEBUG_TRACE, "=> dn2id_add( \"%s\", %ld )\n", dn, id, 0 ); @@ -41,7 +35,7 @@ dn2id_add( return( -1 ); } - dn = strdup( dn ); + dn = ch_strdup( dn ); dn_normalize_case( dn ); key.dptr = dn; @@ -72,19 +66,17 @@ dn2id( ID id; Datum key, data; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); - dn = strdup( dn ); + dn = ch_strdup( dn ); Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 ); dn_normalize_case( dn ); /* first check the cache */ if ( (id = cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) { free( dn ); - Debug( LDAP_DEBUG_TRACE, "<= dn2id %d (in cache)\n", id, + Debug( LDAP_DEBUG_TRACE, "<= dn2id %lu (in cache)\n", id, 0, 0 ); return( id ); } @@ -114,7 +106,7 @@ dn2id( ldbm_datum_free( db->dbc_db, data ); - Debug( LDAP_DEBUG_TRACE, "<= dn2id %d\n", id, 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "<= dn2id %lu\n", id, 0, 0 ); return( id ); } @@ -129,9 +121,7 @@ dn2id_delete( Datum key; int rc; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\" )\n", dn, 0, 0 ); @@ -143,12 +133,15 @@ dn2id_delete( return( -1 ); } + dn = ch_strdup( dn ); dn_normalize_case( dn ); key.dptr = dn; key.dsize = strlen( dn ) + 1; rc = ldbm_cache_delete( db, key ); + free( dn ); + ldbm_cache_close( be, db ); Debug( LDAP_DEBUG_TRACE, "<= dn2id_delete %d\n", rc, 0, 0 ); @@ -170,18 +163,27 @@ dn2entry( { struct ldbminfo *li = (struct ldbminfo *) be->be_private; ID id; - Entry *e; + Entry *e = NULL; char *pdn; - Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: %s\n", + Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n", rw ? "w" : "r", dn, 0); + *matched = NULL; + if ( (id = dn2id( be, dn )) != NOID && (e = id2entry( be, id, rw )) != NULL ) { return( e ); } - *matched = NULL; + + if ( id != NOID ) { + Debug(LDAP_DEBUG_ANY, + "dn2entry_%s: no entry for valid id (%lu), dn \"%s\"\n", + rw ? "w" : "r", id, dn); + /* must have been deleted from underneath us */ + /* treat as if NOID was found */ + } /* stop when we get to the suffix */ if ( be_issuffix( be, dn ) ) { @@ -192,6 +194,9 @@ dn2entry( if ( (pdn = dn_parent( be, dn )) != NULL ) { /* get entry with reader lock */ if ( (e = dn2entry_r( be, pdn, matched )) != NULL ) { + if(*matched != NULL) { + free(*matched); + } *matched = pdn; /* free entry with reader lock */ cache_return_entry_r( &li->li_cache, e ); @@ -203,19 +208,6 @@ dn2entry( return( NULL ); } -#if 0 - if (e->e_state == ENTRY_STATE_DELETED) - continue; - - if (strcmp(dn, e->e_dn) != 0) - continue; - - /* return locked entry entry */ - return(e); - } -} -#endif - Entry * dn2entry_r( Backend *be,