From ed823cdc007747a90f8e450ea55f39fdcc7a9777 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 14 Oct 2008 02:36:19 +0000 Subject: [PATCH] Fix send_search_reference in prev commit --- servers/slapd/back-bdb/search.c | 42 ++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/servers/slapd/back-bdb/search.c b/servers/slapd/back-bdb/search.c index 19393c5261..74258eee23 100644 --- a/servers/slapd/back-bdb/search.c +++ b/servers/slapd/back-bdb/search.c @@ -832,21 +832,51 @@ fetch_entry_retry: if ( !manageDSAit && op->oq_search.rs_scope != LDAP_SCOPE_BASE && is_entry_referral( e ) ) { + struct bdb_op_info bois, *boi2; + struct bdb_lock_info blis; BerVarray erefs = get_entry_referrals( op, e ); rs->sr_ref = referral_rewrite( erefs, &e->e_name, NULL, op->oq_search.rs_scope == LDAP_SCOPE_ONELEVEL ? LDAP_SCOPE_BASE : LDAP_SCOPE_SUBTREE ); - /* free reader lock */ + /* Must set lockinfo so that entry_release will work */ + if (!opinfo) { + boi2 = &bois; + op->o_private = boi2; + bois.boi_bdb = op->o_bd; + bois.boi_txn = NULL; + bois.boi_locker = locker; + bois.boi_err = 0; + bois.boi_locks = &blis; + blis.bli_next = NULL; + bois.boi_flag = BOI_DONTFREE; + } else { + boi2 = opinfo; + blis.bli_next = boi2->boi_locks; + boi2->boi_locks = &blis; + } + blis.bli_id = e->e_id; + blis.bli_lock = lock; + blis.bli_flag = BLI_DONTFREE; + + rs->sr_flags = REP_ENTRY_MUSTRELEASE; + + send_search_reference( op, rs ); + + if ( blis.bli_flag ) { #ifdef SLAP_ZONE_ALLOC - slap_zn_runlock(bdb->bi_cache.c_zctx, e); + slap_zn_runlock(bdb->bi_cache.c_zctx, e); #endif - bdb_cache_return_entry_r( bdb->bi_dbenv, - &bdb->bi_cache, e , &lock ); + bdb_cache_return_entry_r(bdb->bi_dbenv, + &bdb->bi_cache, e, &lock); + op->o_private = opinfo; + if ( opinfo ) { + opinfo->boi_locks = blis.bli_next; + } + } + rs->sr_entry = NULL; e = NULL; - send_search_reference( op, rs ); - ber_bvarray_free( rs->sr_ref ); ber_bvarray_free( erefs ); rs->sr_ref = NULL; -- 2.39.2