]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Fix referral handling
authorHoward Chu <hyc@openldap.org>
Sat, 27 Aug 2011 00:46:10 +0000 (17:46 -0700)
committerHoward Chu <hyc@openldap.org>
Sat, 27 Aug 2011 01:01:28 +0000 (18:01 -0700)
servers/slapd/back-mdb/add.c
servers/slapd/back-mdb/compare.c
servers/slapd/back-mdb/delete.c
servers/slapd/back-mdb/modify.c
servers/slapd/back-mdb/modrdn.c

index 2254839f0fc2b116f0954bb52c4bb75dc0b53f14..7822b9fcf05fdb6f8b140bf6c1720368c3ca3516 100644 (file)
@@ -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,
index 89ca4d4f31ffaa93326ae5e4703d18c0dd9a7a82..9bb05dc53c424d95adb2d24784ea277845d35ca5 100644 (file)
@@ -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;
 
index da6d0665692c513e59d21c8f0745dd3e7c1478c2..01c31f183f6ca23a510fc5b3c947819d3300ac4d 100644 (file)
@@ -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;
index ab6c28bb063b042a7dab77ad93ce2b22708a17db..c577ea9173e1b2de52cc5acc99b457797c78d6c9 100644 (file)
@@ -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;
 
index ee26a61a08d9eed29a7603febf4b0935d518005a..36f5767e3b60086178352862e7e2677f8252f2c2 100644 (file)
@@ -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;