]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/modrdn.c
ITS#3538: improved substrings matching (spaces handled
[openldap] / servers / slapd / modrdn.c
index 4e03e8a595664d0abd204721fb0170b9f68da3d9..c9171d709bb52e6d5ebd5d5003a64264095b8e40 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -181,7 +181,6 @@ do_modrdn(
        rs->sr_err = frontendDB->be_modrdn( op, rs );
 
 cleanup:
-
        slap_graduate_commit_csn( op );
 
        op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
@@ -190,8 +189,10 @@ cleanup:
        op->o_tmpfree( op->orr_newrdn.bv_val, op->o_tmpmemctx );        
        op->o_tmpfree( op->orr_nnewrdn.bv_val, op->o_tmpmemctx );       
 
-       if ( pnewSuperior.bv_val ) op->o_tmpfree( pnewSuperior.bv_val, op->o_tmpmemctx );
-       if ( nnewSuperior.bv_val ) op->o_tmpfree( nnewSuperior.bv_val, op->o_tmpmemctx );
+       if ( !BER_BVISNULL( &pnewSuperior ) ) 
+               op->o_tmpfree( pnewSuperior.bv_val, op->o_tmpmemctx );
+       if ( !BER_BVISNULL( &nnewSuperior ) )
+               op->o_tmpfree( nnewSuperior.bv_val, op->o_tmpmemctx );
 
        return rs->sr_err;
 }
@@ -202,6 +203,7 @@ fe_op_modrdn( Operation *op, SlapReply *rs )
        Backend         *newSuperior_be = NULL;
        int             manageDSAit;
        struct berval   pdn = BER_BVNULL;
+       BackendDB *op_be;
        
        if( op->o_req_ndn.bv_len == 0 ) {
                Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 );
@@ -237,16 +239,26 @@ fe_op_modrdn( Operation *op, SlapReply *rs )
 
                if ( rs->sr_ref != NULL ) {
                        rs->sr_err = LDAP_REFERRAL;
+                       op->o_bd = frontendDB;
                        send_ldap_result( op, rs );
+                       op->o_bd = NULL;
 
                        if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref );
                } else {
+                       op->o_bd = frontendDB;
                        send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "no global superior knowledge" );
+                       op->o_bd = NULL;
                }
                goto cleanup;
        }
 
+       /* If we've got a glued backend, check the real backend */
+       op_be = op->o_bd;
+       if ( SLAP_GLUE_INSTANCE( op->o_bd )) {
+               op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 );
+       }
+
        /* check restrictions */
        if( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) {
                send_ldap_result( op, rs );
@@ -315,6 +327,9 @@ fe_op_modrdn( Operation *op, SlapReply *rs )
 #endif
                {
                        slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
+
+                       op->o_bd = op_be;
+
 #ifdef SLAPD_MULTIMASTER
                        if ( !op->o_bd->be_update_ndn.bv_len || !repl_user )
 #endif