]> git.sur5r.net Git - openldap/commitdiff
ITS#4838 fix fake root handling broken by prev commit
authorHoward Chu <hyc@openldap.org>
Fri, 9 Feb 2007 17:23:00 +0000 (17:23 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 9 Feb 2007 17:23:00 +0000 (17:23 +0000)
servers/slapd/back-bdb/dn2id.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/search.c

index eff601e38ea6d79552a5fb0a264ddae11627f160..07acfeb2d51d04522d208135f04e8855fbbf2dc2 100644 (file)
@@ -349,7 +349,8 @@ bdb_dn2idl(
                ndn->bv_val, 0, 0 );
 
 #ifndef        BDB_MULTIPLE_SUFFIXES
-       if ( prefix == DN_SUBTREE_PREFIX && ei->bei_parent->bei_id == 0 ) {
+       if ( prefix == DN_SUBTREE_PREFIX
+               && ( ei->bei_id == 0 || ei->bei_parent->bei_id == 0 )) {
                BDB_IDL_ALL(bdb, ids);
                return 0;
        }
@@ -1077,7 +1078,8 @@ hdb_dn2idl(
 
 #ifndef BDB_MULTIPLE_SUFFIXES
        if ( op->ors_scope != LDAP_SCOPE_ONELEVEL && 
-               ei->bei_parent->bei_id == 0 )
+               ( ei->bei_id == 0 ||
+               ei->bei_parent->bei_id == 0 ))
        {
                BDB_IDL_ALL( bdb, ids );
                return 0;
index ce41a5cf6bc0790b286f86c0b75df82509d373b0..510197bcba400af23870560b85d0bbadb3aaf125 100644 (file)
@@ -79,6 +79,15 @@ bdb_db_init( BackendDB *be )
        ldap_pvt_thread_rdwr_init( &bdb->bi_idl_tree_rwlock );
        ldap_pvt_thread_mutex_init( &bdb->bi_idl_tree_lrulock );
 
+       {
+               Entry *e = entry_alloc();
+               e->e_id = 0;
+               e->e_private = &bdb->bi_cache.c_dntree;
+               BER_BVSTR( &e->e_name, "" );
+               BER_BVSTR( &e->e_nname, "" );
+               bdb->bi_cache.c_dntree.bei_e = e;
+       }
+
        be->be_private = bdb;
        be->be_cf_ocs = be->bd_info->bi_cf_ocs;
 
index 0a42b63dca5202f7e5fd9cd65ec68657bfb85f5c..94dd7c87ae4eb34b86dc54402d68b708a08d4b4e 100644 (file)
@@ -311,7 +311,7 @@ bdb_search( Operation *op, SlapReply *rs )
        ID              id, cursor;
        ID              candidates[BDB_IDL_UM_SIZE];
        ID              scopes[BDB_IDL_DB_SIZE];
-       Entry           *e = NULL, base, e_root = {0};
+       Entry           *e = NULL, base, *e_root;
        Entry           *matched = NULL;
        EntryInfo       *ei;
        struct berval   realbase = BER_BVNULL;
@@ -348,13 +348,10 @@ bdb_search( Operation *op, SlapReply *rs )
                }
        }
 
+       e_root = bdb->bi_cache.c_dntree.bei_e;
        if ( op->o_req_ndn.bv_len == 0 ) {
                /* DIT root special case */
-               ei = &bdb->bi_cache.c_dntree;
-               e_root.e_private = ei;
-               e_root.e_id = 0;
-               BER_BVSTR( &e_root.e_nname, "" );
-               BER_BVSTR( &e_root.e_name, "" );
+               ei = e_root->e_private;
                rs->sr_err = LDAP_SUCCESS;
        } else {
                if ( op->ors_deref & LDAP_DEREF_FINDING ) {
@@ -484,14 +481,14 @@ dn2entry_retry:
 #ifdef SLAP_ZONE_ALLOC
                slap_zn_runlock(bdb->bi_cache.c_zctx, e);
 #endif
-               if ( e != &e_root ) {
+               if ( e != e_root ) {
                        bdb_cache_return_entry_r(bdb, e, &lock);
                }
                send_ldap_result( op, rs );
                return rs->sr_err;
        }
 
-       if ( !manageDSAit && e != &e_root && is_entry_referral( e ) ) {
+       if ( !manageDSAit && e != e_root && is_entry_referral( e ) ) {
                /* entry is a referral, don't allow add */
                struct berval matched_dn = BER_BVNULL;
                BerVarray erefs = NULL;
@@ -541,7 +538,7 @@ dn2entry_retry:
 #ifdef SLAP_ZONE_ALLOC
                slap_zn_runlock(bdb->bi_cache.c_zctx, e);
 #endif
-               if ( e != &e_root ) {
+               if ( e != e_root ) {
                        bdb_cache_return_entry_r(bdb, e, &lock);
                }
                send_ldap_result( op, rs );
@@ -564,7 +561,7 @@ dn2entry_retry:
 #ifdef SLAP_ZONE_ALLOC
        slap_zn_runlock(bdb->bi_cache.c_zctx, e);
 #endif
-       if ( e != &e_root ) {
+       if ( e != e_root ) {
                bdb_cache_return_entry_r(bdb, e, &lock);
        }
        e = NULL;