From 00ad93ac70053f07ca28afd1378197a988ca49bf Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Fri, 7 Sep 2007 09:38:38 +0000 Subject: [PATCH] also copy modifications we don't deal with, as they will be freed altogether (ITS#5124) --- servers/slapd/overlays/rwm.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/servers/slapd/overlays/rwm.c b/servers/slapd/overlays/rwm.c index 031f9f5d3c..88e7146b79 100644 --- a/servers/slapd/overlays/rwm.c +++ b/servers/slapd/overlays/rwm.c @@ -504,14 +504,10 @@ rwm_op_modify( Operation *op, SlapReply *rs ) isupdate = be_shadow_update( op ); for ( mlp = &op->orm_modlist; *mlp; ) { int is_oc = 0; - Modifications *ml; + Modifications *ml = *mlp; struct ldapmapping *mapping = NULL; - /* duplicate the modlist */ - ml = ch_malloc( sizeof( Modifications )); - *ml = **mlp; - *mlp = ml; - + /* ml points to a temporary mod until needs duplication */ if ( ml->sml_desc == slap_schema.si_ad_objectClass || ml->sml_desc == slap_schema.si_ad_structuralObjectClass ) { @@ -519,6 +515,15 @@ rwm_op_modify( Operation *op, SlapReply *rs ) } else if ( !isupdate && !get_relax( op ) && ml->sml_desc->ad_type->sat_no_user_mod ) { + ml = ch_malloc( sizeof( Modifications ) ); + *ml = **mlp; + if ( (*mlp)->sml_values ) { + ber_bvarray_dup_x( &ml->sml_values, (*mlp)->sml_values, NULL ); + if ( (*mlp)->sml_nvalues ) { + ber_bvarray_dup_x( &ml->sml_nvalues, (*mlp)->sml_nvalues, NULL ); + } + } + *mlp = ml; goto next_mod; } else { @@ -533,6 +538,11 @@ rwm_op_modify( Operation *op, SlapReply *rs ) } } + /* duplicate the modlist */ + ml = ch_malloc( sizeof( Modifications )); + *ml = **mlp; + *mlp = ml; + if ( ml->sml_values != NULL ) { int i, num; struct berval *bva; -- 2.39.5