From: Howard Chu Date: Sat, 27 Aug 2011 00:46:10 +0000 (-0700) Subject: Fix referral handling X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd5c7b74febf3a1b6067dec49f8cb3b975a91ae4;p=thirdparty%2Fopenldap.git Fix referral handling --- diff --git a/servers/slapd/back-mdb/add.c b/servers/slapd/back-mdb/add.c index 2254839f0f..7822b9fcf0 100644 --- a/servers/slapd/back-mdb/add.c +++ b/servers/slapd/back-mdb/add.c @@ -166,9 +166,14 @@ txnReturn: if ( !bvmatch( &pdn, &p->e_nname ) ) { rs->sr_matched = ber_strdup_x( p->e_name.bv_val, op->o_tmpmemctx ); - rs->sr_ref = p != (Entry *)&slap_entry_root && - is_entry_referral( p ) ? get_entry_referrals( op, p ) - : NULL; + if ( p != (Entry *)&slap_entry_root && is_entry_referral( p )) { + BerVarray ref = get_entry_referrals( op, p ); + rs->sr_ref = referral_rewrite( ref, &p->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; + } if ( p != (Entry *)&slap_entry_root ) mdb_entry_return( p ); p = NULL; @@ -223,10 +228,13 @@ txnReturn: } if ( is_entry_referral( p ) ) { + BerVarray ref = get_entry_referrals( op, p ); /* parent is a referral, don't allow add */ rs->sr_matched = ber_strdup_x( p->e_name.bv_val, op->o_tmpmemctx ); - rs->sr_ref = get_entry_referrals( op, p ); + rs->sr_ref = referral_rewrite( ref, &p->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); mdb_entry_return( p ); p = NULL; Debug( LDAP_DEBUG_TRACE, diff --git a/servers/slapd/back-mdb/compare.c b/servers/slapd/back-mdb/compare.c index 89ca4d4f31..9bb05dc53c 100644 --- a/servers/slapd/back-mdb/compare.c +++ b/servers/slapd/back-mdb/compare.c @@ -67,12 +67,16 @@ mdb_compare( Operation *op, SlapReply *rs ) } else { rs->sr_matched = ch_strdup( e->e_dn ); - rs->sr_ref = is_entry_referral( e ) - ? get_entry_referrals( op, e ) - : NULL; + if ( is_entry_referral( e )) { + BerVarray ref = get_entry_referrals( op, e ); + rs->sr_ref = referral_rewrite( ref, &e->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; + } rs->sr_err = LDAP_REFERRAL; } - mdb_entry_return( e ); e = NULL; diff --git a/servers/slapd/back-mdb/delete.c b/servers/slapd/back-mdb/delete.c index da6d066569..01c31f183f 100644 --- a/servers/slapd/back-mdb/delete.c +++ b/servers/slapd/back-mdb/delete.c @@ -138,9 +138,14 @@ txnReturn: if ( p && !BER_BVISEMPTY( &p->e_name )) { rs->sr_matched = ch_strdup( p->e_name.bv_val ); - rs->sr_ref = ( is_entry_referral( p )) - ? get_entry_referrals( op, p ) - : NULL; + if ( is_entry_referral( p )) { + BerVarray ref = get_entry_referrals( op, p ); + rs->sr_ref = referral_rewrite( ref, &p->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; + } } else { rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); @@ -158,8 +163,10 @@ txnReturn: /* get entry */ rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 0 ); switch( rs->sr_err ) { - case 0: case MDB_NOTFOUND: + e = p; + p = NULL; + case 0: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; @@ -176,15 +183,17 @@ txnReturn: "<=- " LDAP_XSTRING(mdb_delete) ": no such object %s\n", op->o_req_dn.bv_val, 0, 0); - rs->sr_matched = ch_strdup( p->e_dn ); - rs->sr_ref = is_entry_referral( p ) - ? get_entry_referrals( op, p ) : NULL; - if ( e ) { - mdb_entry_return( e ); - e = NULL; + rs->sr_matched = ch_strdup( e->e_dn ); + if ( is_entry_referral( e )) { + BerVarray ref = get_entry_referrals( op, e ); + rs->sr_ref = referral_rewrite( ref, &e->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; } - mdb_entry_return( p ); - p = NULL; + mdb_entry_return( e ); + e = NULL; rs->sr_err = LDAP_REFERRAL; rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED; diff --git a/servers/slapd/back-mdb/modify.c b/servers/slapd/back-mdb/modify.c index ab6c28bb06..c577ea9173 100644 --- a/servers/slapd/back-mdb/modify.c +++ b/servers/slapd/back-mdb/modify.c @@ -506,9 +506,14 @@ txnReturn: { if ( e != NULL ) { rs->sr_matched = ch_strdup( e->e_dn ); - rs->sr_ref = is_entry_referral( e ) - ? get_entry_referrals( op, e ) - : NULL; + if ( is_entry_referral( e )) { + BerVarray ref = get_entry_referrals( op, e ); + rs->sr_ref = referral_rewrite( ref, &e->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; + } mdb_entry_return( e ); e = NULL; diff --git a/servers/slapd/back-mdb/modrdn.c b/servers/slapd/back-mdb/modrdn.c index ee26a61a08..36f5767e3b 100644 --- a/servers/slapd/back-mdb/modrdn.c +++ b/servers/slapd/back-mdb/modrdn.c @@ -186,8 +186,10 @@ txnReturn: /* get entry */ rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 0 ); switch( rs->sr_err ) { - case 0: case MDB_NOTFOUND: + e = p; + p = NULL; + case 0: break; case LDAP_BUSY: rs->sr_text = "ldap server busy"; @@ -204,9 +206,14 @@ txnReturn: { if( e != NULL ) { rs->sr_matched = ch_strdup( e->e_dn ); - rs->sr_ref = is_entry_referral( e ) - ? get_entry_referrals( op, e ) - : NULL; + if ( is_entry_referral( e )) { + BerVarray ref = get_entry_referrals( op, e ); + rs->sr_ref = referral_rewrite( ref, &e->e_name, + &op->o_req_dn, LDAP_SCOPE_DEFAULT ); + ber_bvarray_free( ref ); + } else { + rs->sr_ref = NULL; + } mdb_entry_return( e ); e = NULL;