From: Pierangelo Masarati Date: Thu, 28 Feb 2008 16:22:23 +0000 (+0000) Subject: make sure orr_newrdn is passed correctly to libldap (ITS#5397) X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~127 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=b23e4f15a91a9ae6a00241b0b75b67961dd0bb02;p=openldap make sure orr_newrdn is passed correctly to libldap (ITS#5397) --- diff --git a/servers/slapd/back-ldap/modrdn.c b/servers/slapd/back-ldap/modrdn.c index 2c103e6831..ce77db83fc 100644 --- a/servers/slapd/back-ldap/modrdn.c +++ b/servers/slapd/back-ldap/modrdn.c @@ -44,6 +44,7 @@ ldap_back_modrdn( ldap_back_send_t retrying = LDAP_BACK_RETRYING; int rc = LDAP_SUCCESS; char *newSup = NULL; + struct berval newrdn = BER_BVNULL; if ( !ldap_back_dobind( &lc, op, rs, LDAP_BACK_SENDERR ) ) { return rs->sr_err; @@ -72,6 +73,13 @@ ldap_back_modrdn( newSup = op->orr_newSup->bv_val; } + /* 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; rc = ldap_back_controls_add( op, rs, lc, &ctrls ); @@ -82,7 +90,7 @@ retry: } rs->sr_err = ldap_rename( lc->lc_ld, op->o_req_dn.bv_val, - op->orr_newrdn.bv_val, newSup, + newrdn.bv_val, newSup, op->orr_deleteoldrdn, ctrls, NULL, &msgid ); rc = ldap_back_op_result( lc, op, rs, msgid, li->li_timeout[ SLAP_OP_MODRDN ], @@ -99,6 +107,10 @@ retry: cleanup: (void)ldap_back_controls_free( op, rs, &ctrls ); + if ( newrdn.bv_val != op->orr_newrdn.bv_val ) { + op->o_tmpfree( newrdn.bv_val, op->o_tmpmemctx ); + } + if ( lc != NULL ) { ldap_back_release_conn( li, lc ); } 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 ); }