]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/modrdn.c
Notices and acknowledgements
[openldap] / servers / slapd / back-ldbm / modrdn.c
index b739afc6182b97b027d089129db57d71a2426862..c290fa9af1c8a950cb0d290b0aa8885846d05db6 100644 (file)
@@ -83,11 +83,8 @@ ldbm_back_modrdn(
        e = dn2entry_w( op->o_bd, &op->o_req_ndn, &matched );
 
        /* get entry with writer lock */
-#ifdef LDAP_SYNCREPL /* FIXME: dn2entry() should return non-glue entry */
+       /* FIXME: dn2entry() should return non-glue entry */
        if (( e == NULL  ) || ( !manageDSAit && e && is_entry_glue( e ))) {
-#else
-       if ( e == NULL ) {
-#endif
                if ( matched != NULL ) {
                        rs->sr_matched = strdup( matched->e_dn );
                        rs->sr_ref = is_entry_referral( matched )
@@ -95,13 +92,19 @@ ldbm_back_modrdn(
                                : NULL;
                        cache_return_entry_r( &li->li_cache, matched );
                } else {
-#ifdef LDAP_SYNCREPL
-                       BerVarray deref = op->o_bd->syncinfo ?
-                                                         op->o_bd->syncinfo->provideruri_bv : default_referral;
-#else
-                       BerVarray deref = default_referral;
-#endif
-                       rs->sr_ref = referral_rewrite( deref, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+                       BerVarray deref = NULL;
+                       if ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
+                               syncinfo_t *si;
+                               LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) {
+                                       struct berval tmpbv;
+                                       ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] );
+                                       ber_bvarray_add( &deref, &tmpbv );
+                               }
+                       } else {
+                               deref = default_referral;
+                       }
+                       rs->sr_ref = referral_rewrite( deref, NULL, &op->o_req_dn,
+                                                       LDAP_SCOPE_DEFAULT );
                }
 
                ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
@@ -111,12 +114,9 @@ ldbm_back_modrdn(
 
                if ( rs->sr_ref ) ber_bvarray_free( rs->sr_ref );
                free( (char *)rs->sr_matched );
-
-#ifdef LDAP_SYNCREPL
+               rs->sr_ref = NULL;
+               rs->sr_matched = NULL;
                return rs->sr_err;
-#else
-               return( -1 );
-#endif
        }
 
        /* check entry for "entry" acl */
@@ -157,6 +157,8 @@ ldbm_back_modrdn(
                send_ldap_result( op, rs );
 
                if ( rs->sr_ref ) ber_bvarray_free( rs->sr_ref );
+               rs->sr_ref = NULL;
+               rs->sr_matched = NULL;
                goto return_results;
        }
 
@@ -480,7 +482,7 @@ ldbm_back_modrdn(
        }
        
        /* Build target dn and make sure target entry doesn't exist already. */
-       build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn ); 
+       build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn, NULL ); 
        dnNormalize( 0, NULL, NULL, &new_dn, &new_ndn, NULL );
 
 #ifdef NEW_LOGGING
@@ -644,6 +646,7 @@ ldbm_back_modrdn(
        }
 
        rs->sr_err = LDAP_SUCCESS;
+       rs->sr_text = NULL;
        send_ldap_result( op, rs );
        rc = 0;
        cache_entry_commit( e );
@@ -662,10 +665,16 @@ return_results:
        if ( mod != NULL ) {
                Modifications *tmp;
                for (; mod; mod = tmp ) {
+                       /* slap_modrdn2mods does things one way,
+                        * slap_mods_opattrs does it differently
+                        */
+                       if ( mod->sml_op != SLAP_MOD_SOFTADD &&
+                               mod->sml_op != LDAP_MOD_DELETE ) break;
                        if ( mod->sml_nvalues ) free( mod->sml_nvalues[0].bv_val );
                        tmp = mod->sml_next;
                        free( mod );
                }
+               slap_mods_free( mod );
        }
 
        /* LDAP v3 Support */
@@ -688,5 +697,6 @@ return_results:
                entry_free( e );
        }
        ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
+       rs->sr_text = NULL;
        return( rc );
 }