mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-22 14:53:33 -05:00
ITS#5730, patch for #5728 broke referrals
This commit is contained in:
parent
b3091cb462
commit
faadcf3908
1 changed files with 37 additions and 6 deletions
|
|
@ -852,20 +852,51 @@ fetch_entry_retry:
|
|||
if ( !manageDSAit && op->oq_search.rs_scope != LDAP_SCOPE_BASE
|
||||
&& is_entry_referral( e ) )
|
||||
{
|
||||
struct bdb_op_info bois;
|
||||
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 */
|
||||
#ifdef SLAP_ZONE_ALLOC
|
||||
slap_zn_runlock(bdb->bi_cache.c_zctx, e);
|
||||
#endif
|
||||
bdb_cache_return_entry_r( bdb, e, &lock );
|
||||
e = NULL;
|
||||
/* Must set lockinfo so that entry_release will work */
|
||||
if (!opinfo) {
|
||||
bois.boi_oe.oe_key = bdb;
|
||||
bois.boi_txn = NULL;
|
||||
bois.boi_err = 0;
|
||||
bois.boi_acl_cache = op->o_do_not_cache;
|
||||
bois.boi_flag = BOI_DONTFREE;
|
||||
bois.boi_locks = &blis;
|
||||
blis.bli_next = NULL;
|
||||
LDAP_SLIST_INSERT_HEAD( &op->o_extra, &bois.boi_oe,
|
||||
oe_next );
|
||||
} else {
|
||||
blis.bli_next = opinfo->boi_locks;
|
||||
opinfo->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);
|
||||
#endif
|
||||
bdb_cache_return_entry_r(bdb, e, &lock);
|
||||
if ( opinfo ) {
|
||||
opinfo->boi_locks = blis.bli_next;
|
||||
} else {
|
||||
LDAP_SLIST_REMOVE( &op->o_extra, &bois.boi_oe,
|
||||
OpExtra, oe_next );
|
||||
}
|
||||
}
|
||||
rs->sr_entry = NULL;
|
||||
e = NULL;
|
||||
|
||||
ber_bvarray_free( rs->sr_ref );
|
||||
ber_bvarray_free( erefs );
|
||||
rs->sr_ref = NULL;
|
||||
|
|
|
|||
Loading…
Reference in a new issue