From 7221e9b1bfd00d92f50033030b216f0d13677005 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Tue, 4 Jan 2011 21:05:31 +0000 Subject: [PATCH] ITS#6700 --- CHANGES | 1 + servers/slapd/overlays/memberof.c | 47 ++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 94c74a052c..06eac06484 100644 --- a/CHANGES +++ b/CHANGES @@ -70,6 +70,7 @@ OpenLDAP 2.4.24 Engineering Fixed slapo-dynlist entry handling (ITS#6752) Fixed slapo-memberof log messages (ITS#6748) Fixed slapo-memberof with an empty groupOfNames (ITS#6670) + Fixed slapo-memberof with modrdn operations (ITS#6700) Fixed slapo-pcache callback freeing (ITS#6640) Fixed slapo-pcache to ignore undefined attrs (ITS#6600) Fixed slapo-ppolicy don't update opattrs on consumers (ITS#6608) diff --git a/servers/slapd/overlays/memberof.c b/servers/slapd/overlays/memberof.c index f4c013118c..c46fdb2536 100644 --- a/servers/slapd/overlays/memberof.c +++ b/servers/slapd/overlays/memberof.c @@ -388,6 +388,9 @@ memberof_value_modify( op2.orm_no_opattrs = 0; if ( new_ndn != NULL ) { + BackendInfo *bi = op2.o_bd->bd_info; + OpExtra oex; + assert( !BER_BVISNULL( new_dn ) ); assert( !BER_BVISNULL( new_ndn ) ); @@ -397,12 +400,17 @@ memberof_value_modify( ml->sml_values[ 0 ] = *new_dn; ml->sml_nvalues[ 0 ] = *new_ndn; + oex.oe_key = (void *)&memberof; + LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next); + op2.o_bd->bd_info = (BackendInfo *)on->on_info; (void)op->o_bd->be_modify( &op2, &rs2 ); + op2.o_bd->bd_info = bi; + LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next); if ( rs2.sr_err != LDAP_SUCCESS ) { char buf[ SLAP_TEXT_BUFLEN ]; snprintf( buf, sizeof( buf ), - "memberof_value_modify %s=\"%s\" failed err=%d", - ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err ); + "memberof_value_modify DN=\"%s\" add %s=\"%s\" failed err=%d", + op2.o_req_dn.bv_val, ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err ); Debug( LDAP_DEBUG_ANY, "%s: %s\n", op->o_log_prefix, buf, 0 ); } @@ -422,6 +430,9 @@ memberof_value_modify( } if ( old_ndn != NULL ) { + BackendInfo *bi = op2.o_bd->bd_info; + OpExtra oex; + assert( !BER_BVISNULL( old_dn ) ); assert( !BER_BVISNULL( old_ndn ) ); @@ -431,12 +442,17 @@ memberof_value_modify( ml->sml_values[ 0 ] = *old_dn; ml->sml_nvalues[ 0 ] = *old_ndn; + oex.oe_key = (void *)&memberof; + LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next); + op2.o_bd->bd_info = (BackendInfo *)on->on_info; (void)op->o_bd->be_modify( &op2, &rs2 ); + op2.o_bd->bd_info = bi; + LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next); if ( rs2.sr_err != LDAP_SUCCESS ) { char buf[ SLAP_TEXT_BUFLEN ]; snprintf( buf, sizeof( buf ), - "memberof_value_modify %s=\"%s\" failed err=%d", - ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err ); + "memberof_value_modify DN=\"%s\" delete %s=\"%s\" failed err=%d", + op2.o_req_dn.bv_val, ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err ); Debug( LDAP_DEBUG_ANY, "%s: %s\n", op->o_log_prefix, buf, 0 ); } @@ -492,6 +508,12 @@ memberof_op_add( Operation *op, SlapReply *rs ) struct berval save_dn, save_ndn; slap_callback *sc; memberof_cbinfo_t *mci; + OpExtra *oex; + + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == (void *)&memberof ) + return SLAP_CB_CONTINUE; + } if ( op->ora_e->e_attrs == NULL ) { /* FIXME: global overlay; need to deal with */ @@ -720,7 +742,12 @@ memberof_op_delete( Operation *op, SlapReply *rs ) slap_callback *sc; memberof_cbinfo_t *mci; + OpExtra *oex; + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == (void *)&memberof ) + return SLAP_CB_CONTINUE; + } sc = op->o_tmpalloc( sizeof(slap_callback)+sizeof(*mci), op->o_tmpmemctx ); sc->sc_private = sc+1; @@ -754,6 +781,12 @@ memberof_op_modify( Operation *op, SlapReply *rs ) struct berval save_dn, save_ndn; slap_callback *sc; memberof_cbinfo_t *mci, mcis; + OpExtra *oex; + + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == (void *)&memberof ) + return SLAP_CB_CONTINUE; + } if ( MEMBEROF_REVERSE( mo ) ) { for ( mlp = &op->orm_modlist; *mlp; mlp = &(*mlp)->sml_next ) { @@ -1165,6 +1198,12 @@ memberof_op_modrdn( Operation *op, SlapReply *rs ) slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; slap_callback *sc; memberof_cbinfo_t *mci; + OpExtra *oex; + + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == (void *)&memberof ) + return SLAP_CB_CONTINUE; + } sc = op->o_tmpalloc( sizeof(slap_callback)+sizeof(*mci), op->o_tmpmemctx ); sc->sc_private = sc+1; -- 2.39.5