]> git.sur5r.net Git - openldap/commitdiff
ITS#7930 partial fix
authorhyc <hyc@openldap.org>
Sat, 6 Sep 2014 08:14:46 +0000 (09:14 +0100)
committerhyc <hyc@openldap.org>
Sat, 6 Sep 2014 08:14:46 +0000 (09:14 +0100)
Only restore op->o_req_dn if no one else changed it on us.

servers/slapd/back-ldap/chain.c

index 93bad4e4b37eb9e61b1fcac2f0da7d71815c1aa0..14a93abcb6349f930ab71a5f7cfd8aab5d98c076 100644 (file)
@@ -626,6 +626,11 @@ cleanup:;
                }
 
 further_cleanup:;
+               if ( op->o_req_dn.bv_val == pdn.bv_val ) {
+                       op->o_req_dn = odn;
+                       op->o_req_ndn = ondn;
+               }
+
                if ( free_dn ) {
                        op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );
                        op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );
@@ -651,9 +656,6 @@ further_cleanup:;
                rc = rs2.sr_err;
        }
 
-       op->o_req_dn = odn;
-       op->o_req_ndn = ondn;
-
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
        (void)chaining_control_remove( op, &ctrls );
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
@@ -897,14 +899,16 @@ cleanup:;
                }
                
 further_cleanup:;
+               if ( op->o_req_dn.bv_val == pdn.bv_val ) {
+                       op->o_req_dn = odn;
+                       op->o_req_ndn = ondn;
+               }
+
                if ( free_dn ) {
                        op->o_tmpfree( pdn.bv_val, op->o_tmpmemctx );
                        op->o_tmpfree( ndn.bv_val, op->o_tmpmemctx );
                }
 
-               op->o_req_dn = odn;
-               op->o_req_ndn = ondn;
-
                if ( tmp_oq_search.rs_filter != NULL ) {
                        filter_free_x( op, tmp_oq_search.rs_filter, 1 );
                }
@@ -927,8 +931,6 @@ further_cleanup:;
        (void)chaining_control_remove( op, &ctrls );
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
 
-       op->o_req_dn = odn;
-       op->o_req_ndn = ondn;
        rs->sr_type = REP_SEARCHREF;
        rs->sr_entry = save_entry;
        rs->sr_flags = save_flags;