static int search_aliases(
Operation *op,
SlapReply *rs,
- Entry *e,
+ ID e_id,
MDB_txn *txn,
MDB_cursor *mci,
ID2L scopes,
return rs->sr_err;
}
oldsubs[0] = 1;
- oldsubs[1] = e->e_id;
+ oldsubs[1] = e_id;
MDB_IDL_ZERO( visited );
MDB_IDL_ZERO( newsubs );
/* Set curscop to only the aliases in the current scope. Start with
* all the aliases, then get the intersection with the scope.
*/
- rs->sr_err = mdb_idscope( op, txn, e->e_id, aliases, curscop );
-
- if (first) {
- first = 0;
- } else {
- mdb_entry_return( op, e );
- }
+ rs->sr_err = mdb_idscope( op, txn, e_id, aliases, curscop );
/* Dereference all of the aliases in the current scope. */
cursora = 0;
* be found, ignore it and move on. This should never happen;
* we should never see the ID of an entry that doesn't exist.
*/
- rs->sr_err = mdb_id2entry(op, mci, ido, &e);
- if ( rs->sr_err != LDAP_SUCCESS ) {
- goto nextido;
+ {
+ MDB_val edata;
+ rs->sr_err = mdb_id2edata(op, mci, ido, &edata);
+ if ( rs->sr_err != MDB_SUCCESS ) {
+ goto nextido;
+ }
+ e_id = ido;
}
}
return rs->sr_err;
id != NOID ; id = mdb_idl_next( candidates, &cursor ) )
{
int scopeok;
+ MDB_val edata;
loop_begin:
} else {
/* get the entry */
- rs->sr_err = mdb_id2entry( op, mci, id, &e );
-
- if (rs->sr_err == LDAP_BUSY) {
- rs->sr_text = "ldap server busy";
- send_ldap_result( op, rs );
- goto done;
-
- } else if ( rs->sr_err == LDAP_OTHER ) {
- rs->sr_text = "internal error";
- send_ldap_result( op, rs );
- goto done;
- }
-
- if ( e == NULL ) {
+ rs->sr_err = mdb_id2edata( op, mci, id, &edata );
+ if ( rs->sr_err == MDB_NOTFOUND ) {
if( !MDB_IDL_IS_RANGE(candidates) ) {
/* only complain for non-range IDLs */
Debug( LDAP_DEBUG_TRACE,
}
goto loop_continue;
+ } else if ( rs->sr_err ) {
+ rs->sr_err = LDAP_OTHER;
+ rs->sr_text = "internal error in mdb_id2edata";
+ send_ldap_result( op, rs );
+ goto done;
}
}
- if ( is_entry_subentry( e ) ) {
- if( op->oq_search.rs_scope != LDAP_SCOPE_BASE ) {
- if(!get_subentries_visibility( op )) {
- /* only subentries are visible */
- goto loop_continue;
- }
-
- } else if ( get_subentries( op ) &&
- !get_subentries_visibility( op ))
- {
- /* only subentries are visible */
- goto loop_continue;
- }
-
- } else if ( get_subentries_visibility( op )) {
- /* only subentries are visible */
- goto loop_continue;
- }
-
/* Does this candidate actually satisfy the search scope?
*/
scopeok = 0;
break;
}
+ /* Not in scope, ignore it */
+ if ( !scopeok )
+ {
+ Debug( LDAP_DEBUG_TRACE,
+ LDAP_XSTRING(mdb_search)
+ ": %ld scope not okay\n",
+ (long) id, 0, 0 );
+ goto loop_continue;
+ }
+
+ if ( id != base->e_id ) {
+ rs->sr_err = mdb_entry_decode( op, &edata, &e );
+ if ( rs->sr_err ) {
+ rs->sr_err = LDAP_OTHER;
+ rs->sr_text = "internal error in mdb_endtry_decode";
+ send_ldap_result( op, rs );
+ goto done;
+ }
+ }
+
+ if ( is_entry_subentry( e ) ) {
+ if( op->oq_search.rs_scope != LDAP_SCOPE_BASE ) {
+ if(!get_subentries_visibility( op )) {
+ /* only subentries are visible */
+ goto loop_continue;
+ }
+
+ } else if ( get_subentries( op ) &&
+ !get_subentries_visibility( op ))
+ {
+ /* only subentries are visible */
+ goto loop_continue;
+ }
+
+ } else if ( get_subentries_visibility( op )) {
+ /* only subentries are visible */
+ goto loop_continue;
+ }
+
/* aliases were already dereferenced in candidate list */
if ( op->ors_deref & LDAP_DEREF_SEARCHING ) {
/* but if the search base is an alias, and we didn't
}
}
- /* Not in scope, ignore it */
- if ( !scopeok )
- {
- Debug( LDAP_DEBUG_TRACE,
- LDAP_XSTRING(mdb_search)
- ": %ld scope not okay\n",
- (long) id, 0, 0 );
- goto loop_continue;
- }
-
if ( !manageDSAit && is_entry_glue( e )) {
goto loop_continue;
}