From: Howard Chu Date: Thu, 25 Aug 2011 00:47:22 +0000 (-0700) Subject: Need both norm and non-norm match from dn2id X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=da7b9e2ea5c40fe60bb4d9151c9e370a1bdaa856;hp=9c671db81b4ab48b169dd8157f45891594f7af35;p=openldap Need both norm and non-norm match from dn2id --- diff --git a/servers/slapd/back-mdb/dn2entry.c b/servers/slapd/back-mdb/dn2entry.c index 12a51465c3..3aa8167534 100644 --- a/servers/slapd/back-mdb/dn2entry.c +++ b/servers/slapd/back-mdb/dn2entry.c @@ -37,14 +37,14 @@ mdb_dn2entry( { int rc, rc2; ID id = NOID; - struct berval bvm; + struct berval mbv, nmbv; Debug(LDAP_DEBUG_TRACE, "mdb_dn2entry(\"%s\")\n", dn->bv_val, 0, 0 ); *e = NULL; - rc = mdb_dn2id( op, tid, dn, &id, &bvm ); + rc = mdb_dn2id( op, tid, dn, &id, &mbv, &nmbv ); if ( rc ) { if ( matched ) rc2 = mdb_id2entry( op, tid, id, e ); @@ -53,9 +53,11 @@ mdb_dn2entry( rc = mdb_id2entry( op, tid, id, e ); } if ( *e ) { - (*e)->e_name = bvm; + (*e)->e_name = mbv; if ( rc == MDB_SUCCESS ) ber_dupbv_x( &(*e)->e_nname, dn, op->o_tmpmemctx ); + else + ber_dupbv_x( &(*e)->e_nname, &nmbv, op->o_tmpmemctx ); } return rc; diff --git a/servers/slapd/back-mdb/dn2id.c b/servers/slapd/back-mdb/dn2id.c index 82ec07b7f1..972e36b12d 100644 --- a/servers/slapd/back-mdb/dn2id.c +++ b/servers/slapd/back-mdb/dn2id.c @@ -259,7 +259,8 @@ mdb_dn2id( MDB_txn *txn, struct berval *in, ID *id, - struct berval *matched ) + struct berval *matched, + struct berval *nmatched ) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; MDB_cursor *cursor; @@ -287,6 +288,10 @@ mdb_dn2id( matched->bv_len = 0; *matched->bv_val-- = '\0'; } + if ( nmatched ) { + nmatched->bv_len = 0; + nmatched->bv_val = 0; + } nrlen = tmp.bv_len - op->o_bd->be_nsuffix[0].bv_len; tmp.bv_val += nrlen; @@ -328,6 +333,10 @@ mdb_dn2id( matched->bv_len++; } } + if ( nmatched ) { + nmatched->bv_val = tmp.bv_val; + } + if ( tmp.bv_val > in->bv_val ) { for (ptr = tmp.bv_val - 2; ptr > in->bv_val && !DN_SEPARATOR(*ptr); ptr--) /* empty */; @@ -347,6 +356,9 @@ mdb_dn2id( strcpy( ptr, matched->bv_val ); matched->bv_val = ptr; } + if ( nmatched ) { + nmatched->bv_len = in->bv_len - (nmatched->bv_val - in->bv_val); + } done: if( rc != 0 ) { diff --git a/servers/slapd/back-mdb/filterindex.c b/servers/slapd/back-mdb/filterindex.c index 86dd11ba7c..3e3a87b7ef 100644 --- a/servers/slapd/back-mdb/filterindex.c +++ b/servers/slapd/back-mdb/filterindex.c @@ -489,7 +489,7 @@ ext_candidates( MDB_IDL_ZERO( ids ); if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) { base: - rc = mdb_dn2id( op, rtxn, &mra->ma_value, &id, NULL ); + rc = mdb_dn2id( op, rtxn, &mra->ma_value, &id, NULL, NULL ); if ( rc == MDB_SUCCESS ) { mdb_idl_insert( ids, id ); } @@ -690,7 +690,7 @@ equality_candidates( if ( ava->aa_desc == slap_schema.si_ad_entryDN ) { ID id; - rc = mdb_dn2id( op, rtxn, &ava->aa_value, &id, NULL ); + rc = mdb_dn2id( op, rtxn, &ava->aa_value, &id, NULL, NULL ); if ( rc == LDAP_SUCCESS ) { /* exactly one ID can match */ ids[0] = 1; diff --git a/servers/slapd/back-mdb/modrdn.c b/servers/slapd/back-mdb/modrdn.c index b7b406299b..ee26a61a08 100644 --- a/servers/slapd/back-mdb/modrdn.c +++ b/servers/slapd/back-mdb/modrdn.c @@ -415,7 +415,7 @@ txnReturn: new_ndn.bv_val, 0, 0 ); /* Shortcut the search */ - rs->sr_err = mdb_dn2id ( op, txn, &new_ndn, &nid, NULL ); + rs->sr_err = mdb_dn2id ( op, txn, &new_ndn, &nid, NULL, NULL ); switch( rs->sr_err ) { case MDB_NOTFOUND: break; diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index ed9a3d7c5d..2c05d6b370 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -66,9 +66,10 @@ int mdb_dn2entry LDAP_P(( Operation *op, MDB_txn *tid, int mdb_dn2id( Operation *op, MDB_txn *txn, - struct berval *dn, + struct berval *ndn, ID *id, - struct berval *matched ); + struct berval *matched, + struct berval *nmatched ); int mdb_dn2id_add( Operation *op, diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index acf8799d31..b1f5100115 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -255,7 +255,7 @@ ID mdb_tool_dn2id_get( op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; - rc = mdb_dn2id( &op, txn, dn, &id, NULL ); + rc = mdb_dn2id( &op, txn, dn, &id, NULL, NULL ); if ( rc == MDB_NOTFOUND ) return NOID; @@ -360,7 +360,7 @@ static int mdb_tool_next_id( { struct berval dn = e->e_name; struct berval ndn = e->e_nname; - struct berval pdn, npdn, matched; + struct berval pdn, npdn, nmatched; ID id, pid = 0; int rc; @@ -369,12 +369,12 @@ static int mdb_tool_next_id( return 0; } - rc = mdb_dn2id( op, tid, &ndn, &id, &matched ); + rc = mdb_dn2id( op, tid, &ndn, &id, NULL, &nmatched ); if ( rc == MDB_NOTFOUND ) { if ( !be_issuffix( op->o_bd, &ndn ) ) { ID eid = e->e_id; dnParent( &ndn, &npdn ); - if ( matched.bv_len != npdn.bv_len ) { + if ( nmatched.bv_len != npdn.bv_len ) { dnParent( &dn, &pdn ); e->e_name = pdn; e->e_nname = npdn;