X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodrdn.c;h=c2ac4c77acb6d61f64699931cc25778c834ca7fc;hb=1939ed3fc29d0d1c01a0a9390d2c51ac2a85260f;hp=3427885a749cc8c27804fcbfbc8f5d9aa4426673;hpb=0eb502355047d32621b01094c0dd9c84f733498f;p=openldap diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index 3427885a74..c2ac4c77ac 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -184,6 +184,12 @@ do_modrdn( op->o_bd = frontendDB; rs->sr_err = frontendDB->be_modrdn( op, rs ); +#ifdef LDAP_X_TXN + if( rs->sr_err == LDAP_X_TXN_SPECIFY_OKAY ) { + /* skip cleanup */ + } +#endif + cleanup: op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); @@ -194,10 +200,12 @@ cleanup: if ( op->orr_modlist != NULL ) slap_mods_free( op->orr_modlist, 1 ); - if ( !BER_BVISNULL( &pnewSuperior ) ) + if ( !BER_BVISNULL( &pnewSuperior ) ) { op->o_tmpfree( pnewSuperior.bv_val, op->o_tmpmemctx ); - if ( !BER_BVISNULL( &nnewSuperior ) ) + } + if ( !BER_BVISNULL( &nnewSuperior ) ) { op->o_tmpfree( nnewSuperior.bv_val, op->o_tmpmemctx ); + } return rs->sr_err; } @@ -208,7 +216,7 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) Backend *newSuperior_be = NULL; int manageDSAit; struct berval pdn = BER_BVNULL; - BackendDB *op_be; + BackendDB *op_be, *bd = op->o_bd; if( op->o_req_ndn.bv_len == 0 ) { Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 ); @@ -238,22 +246,19 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) */ op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 1 ); if ( op->o_bd == NULL ) { + op->o_bd = bd; rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); if (!rs->sr_ref) rs->sr_ref = default_referral; 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; } @@ -299,17 +304,13 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) if ( op->o_bd->be_modrdn ) { /* do the update here */ int repl_user = be_isupdate( op ); -#ifndef SLAPD_MULTIMASTER - if ( !SLAP_SHADOW(op->o_bd) || repl_user ) -#endif /* ! SLAPD_MULTIMASTER */ + if ( !SLAP_SINGLE_SHADOW(op->o_bd) || repl_user ) { 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 /* SLAPD_MULTIMASTER */ { cb.sc_next = op->o_callback; op->o_callback = &cb; @@ -355,7 +356,6 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) op->o_delete_glue_parent = 0; } -#ifndef SLAPD_MULTIMASTER } else { BerVarray defref = op->o_bd->be_update_refs ? op->o_bd->be_update_refs : default_referral; @@ -373,7 +373,6 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, "shadow context; no update referral" ); } -#endif /* ! SLAPD_MULTIMASTER */ } } else { send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, @@ -381,6 +380,7 @@ fe_op_modrdn( Operation *op, SlapReply *rs ) } cleanup:; + op->o_bd = bd; return rs->sr_err; } @@ -399,7 +399,7 @@ slap_modrdn2mods( if ( ldap_bv2rdn_x( &op->oq_modrdn.rs_newrdn, &new_rdn, (char **)&rs->sr_text, LDAP_DN_FORMAT_LDAP, op->o_tmpmemctx ) ) { Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(slap_modrdn2mods) ": can't figure out " + "slap_modrdn2mods: can't figure out " "type(s)/value(s) of newrdn\n", 0, 0, 0 ); rs->sr_err = LDAP_INVALID_DN_SYNTAX; rs->sr_text = "unknown type(s) used in RDN"; @@ -410,13 +410,14 @@ slap_modrdn2mods( if ( ldap_bv2rdn_x( &op->o_req_dn, &old_rdn, (char **)&rs->sr_text, LDAP_DN_FORMAT_LDAP, op->o_tmpmemctx ) ) { Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(slap_modrdn2mods) ": can't figure out " + "slap_modrdn2mods: can't figure out " "type(s)/value(s) of oldrdn\n", 0, 0, 0 ); rs->sr_err = LDAP_OTHER; rs->sr_text = "cannot parse RDN from old DN"; goto done; } } + rs->sr_text = NULL; /* Add new attribute values to the entry */ for ( a_cnt = 0; new_rdn[a_cnt]; a_cnt++ ) { @@ -502,13 +503,6 @@ slap_modrdn2mods( done: -#if 0 - /* should be done by backend */ - if ( rs->sr_err == LDAP_SUCCESS && !repl_user ) { - slap_mods_opattrs( op, &op->orr_modlist, 1 ); - } -#endif - /* LDAP v2 supporting correct attribute handling. */ if ( rs->sr_err != LDAP_SUCCESS && op->orr_modlist != NULL ) { Modifications *tmp;