X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fmodrdn.c;h=90f708e9d645e34128feac7525a7697130ec0c07;hb=f7e3566ceb66c65a5f581f073ceaead4d6b9e860;hp=117d7247ab90c52317aaae9caad2a8a4f070539f;hpb=e112b832ef4e33df203de6dac60b2453951b20d4;p=openldap diff --git a/servers/slapd/back-meta/modrdn.c b/servers/slapd/back-meta/modrdn.c index 117d7247ab..90f708e9d6 100644 --- a/servers/slapd/back-meta/modrdn.c +++ b/servers/slapd/back-meta/modrdn.c @@ -44,6 +44,7 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) int msgid; int do_retry = 1; LDAPControl **ctrls = NULL; + struct berval newrdn = BER_BVNULL; mc = meta_back_getconn( op, rs, &candidate, LDAP_BACK_SENDERR ); if ( !mc || !meta_back_dobind( op, rs, mc, LDAP_BACK_SENDERR ) ) { @@ -118,6 +119,13 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) goto cleanup; } + /* NOTE: we need to copy the newRDN in case it was formed + * from a DN by simply changing the length (ITS#5397) */ + newrdn = op->orr_newrdn; + if ( newrdn.bv_val[ newrdn.bv_len ] != '\0' ) { + ber_dupbv_x( &newrdn, &op->orr_newrdn, op->o_tmpmemctx ); + } + retry:; ctrls = op->o_ctrls; if ( meta_back_controls_add( op, rs, mc, candidate, &ctrls ) != LDAP_SUCCESS ) @@ -127,7 +135,7 @@ retry:; } rs->sr_err = ldap_rename( mc->mc_conns[ candidate ].msc_ld, - mdn.bv_val, op->orr_newrdn.bv_val, + mdn.bv_val, newrdn.bv_val, mnewSuperior.bv_val, op->orr_deleteoldrdn, ctrls, NULL, &msgid ); rs->sr_err = meta_back_op_result( mc, op, rs, candidate, msgid, @@ -156,6 +164,10 @@ cleanup:; BER_BVZERO( &mnewSuperior ); } + if ( newrdn.bv_val != op->orr_newrdn.bv_val ) { + op->o_tmpfree( newrdn.bv_val, op->o_tmpmemctx ); + } + if ( mc ) { meta_back_release_conn( mi, mc ); }