]> git.sur5r.net Git - openldap/commitdiff
ITS#5730, patch for #5728 broke referrals
authorHoward Chu <hyc@openldap.org>
Wed, 8 Oct 2008 21:33:45 +0000 (21:33 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 8 Oct 2008 21:33:45 +0000 (21:33 +0000)
servers/slapd/back-bdb/search.c

index bbff1f4ebe3afaa746e5a743a734ae030e666d09..aa0b5f975bf192861a32ffdb85e5a522d8a27c96 100644 (file)
@@ -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 */
+                       /* 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);
+                               slap_zn_runlock(bdb->bi_cache.c_zctx, e);
 #endif
-                       bdb_cache_return_entry_r( bdb, e, &lock );
+                               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;
 
-                       send_search_reference( op, rs );
-
                        ber_bvarray_free( rs->sr_ref );
                        ber_bvarray_free( erefs );
                        rs->sr_ref = NULL;