ITS#7702 fix results with aliases

Aliases pointing within the original search scope could cause
the same entry to be returned multiple times. Check for subtree
scope and duplicate scopes.
This commit is contained in:
Howard Chu 2014-08-26 20:07:40 +01:00
parent e5f5a4ab5f
commit cac00c6a97
4 changed files with 20 additions and 10 deletions

View File

@ -556,7 +556,8 @@ mdb_id2name(
MDB_cursor **cursp,
ID id,
struct berval *name,
struct berval *nname )
struct berval *nname,
ID *iscopes )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
MDB_dbi dbi = mdb->mi_dn2id;
@ -589,6 +590,11 @@ mdb_id2name(
ptr = data.mv_data;
ptr += data.mv_size - sizeof(ID);
memcpy( &id, ptr, sizeof(ID) );
if ( iscopes ) {
rc = mdb_idl_search( iscopes, id );
if ( iscopes[rc] == id )
return MDB_KEYEXIST;
}
d = data.mv_data;
nrlen = (d->nrdnlen[0] << 8) | d->nrdnlen[1];
rlen = data.mv_size - sizeof(diskNode) - nrlen;

View File

@ -123,7 +123,8 @@ int mdb_id2name(
MDB_cursor **cursp,
ID eid,
struct berval *name,
struct berval *nname);
struct berval *nname,
ID *iscopes );
int mdb_idscope(
Operation *op,

View File

@ -722,12 +722,9 @@ dn2entry_retry:
if (scopes[0].mid > 1) {
cursor = 1;
for (cscope = 1; cscope <= scopes[0].mid; cscope++) {
/* Ignore the original base */
if (scopes[cscope].mid == base->e_id)
continue;
iscopes[cursor++] = scopes[cscope].mid;
}
iscopes[0] = scopes[0].mid - 1;
iscopes[0] = scopes[0].mid;
} else {
iscopes[0] = 0;
}
@ -740,7 +737,7 @@ dn2entry_retry:
id = NOID;
else
id = isc.id;
cscope = 0;
cscope = 1; /* skip original base */
} else {
id = mdb_idl_first( candidates, &cursor );
wwctx.mcd = NULL;
@ -952,7 +949,7 @@ notfound:
pdn = base->e_name;
pndn = base->e_nname;
} else {
mdb_id2name( op, ltid, &isc.mc, scopes[isc.nscope].mid, &pdn, &pndn );
mdb_id2name( op, ltid, &isc.mc, scopes[isc.nscope].mid, &pdn, &pndn, NULL );
}
e->e_name.bv_len = pdn.bv_len;
e->e_nname.bv_len = pndn.bv_len;
@ -1129,7 +1126,13 @@ loop_continue:
mdb_entry_return( op, base );
rs->sr_err = mdb_id2entry(op, mci, isc.id, &base);
if ( !rs->sr_err ) {
mdb_id2name( op, ltid, &isc.mc, isc.id, &base->e_name, &base->e_nname );
rc = mdb_id2name( op, ltid, &isc.mc, isc.id, &base->e_name, &base->e_nname,
op->ors_scope == LDAP_SCOPE_SUBTREE ? iscopes : NULL );
if ( rc == MDB_KEYEXIST ) {
mdb_entry_return( op, base );
base = NULL;
continue;
}
isc.numrdns = 0;
if (isc.oscope == LDAP_SCOPE_ONELEVEL)
isc.oscope = LDAP_SCOPE_BASE;

View File

@ -380,7 +380,7 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep )
op.o_tmpmemctx = NULL;
op.o_tmpmfuncs = &ch_mfuncs;
if ( slapMode & SLAP_TOOL_READONLY ) {
rc = mdb_id2name( &op, mdb_tool_txn, &idcursor, id, &dn, &ndn );
rc = mdb_id2name( &op, mdb_tool_txn, &idcursor, id, &dn, &ndn, NULL );
if ( rc ) {
rc = LDAP_OTHER;
if ( e ) {