From 225fa32d8ff581c053e23f2df51aee26885c0a0f Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sat, 5 Jan 2002 11:41:23 +0000 Subject: [PATCH] BVarray fixes for ldap_dnattr_rewrite --- servers/slapd/back-ldap/add.c | 18 +++++++++--------- servers/slapd/back-ldap/back-ldap.h | 2 +- servers/slapd/back-meta/add.c | 8 +++++++- servers/slapd/back-meta/modify.c | 12 ++++++++++-- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/servers/slapd/back-ldap/add.c b/servers/slapd/back-ldap/add.c index 668c22167c..7dfcd9ad08 100644 --- a/servers/slapd/back-ldap/add.c +++ b/servers/slapd/back-ldap/add.c @@ -164,6 +164,7 @@ ldap_back_add( attrs[i]->mod_vals.modv_bvals = ch_malloc((j+1)*sizeof(struct berval *)); for (j=0; a->a_vals[j].bv_val; j++) attrs[i]->mod_vals.modv_bvals[j] = &a->a_vals[j]; + attrs[i]->mod_vals.modv_bvals[j] = NULL; i++; } attrs[i] = NULL; @@ -185,15 +186,14 @@ ldap_back_add( int ldap_dnattr_rewrite( struct rewrite_info *rwinfo, - struct berval **a_vals, + BVarray a_vals, void *cookie ) { - int j; char *mattr; - for ( j = 0; a_vals[ j ] != NULL; j++ ) { - switch ( rewrite_session( rwinfo, "bindDn", a_vals[ j ]->bv_val, + for ( ; a_vals->bv_val != NULL; a_vals++ ) { + switch ( rewrite_session( rwinfo, "bindDn", a_vals->bv_val, cookie, &mattr )) { case REWRITE_REGEXEC_OK: if ( mattr == NULL ) { @@ -204,17 +204,17 @@ ldap_dnattr_rewrite( LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1, "[rw] bindDn (in add of dn-valued" " attr): \"%s\" -> \"%s\"\n", - a_vals[ j ]->bv_val, mattr )); + a_vals->bv_val, mattr )); #else /* !NEW_LOGGING */ Debug( LDAP_DEBUG_ARGS, "rw> bindDn (in add of dn-valued attr):" " \"%s\" -> \"%s\"\n%s", - a_vals[ j ]->bv_val, mattr, "" ); + a_vals->bv_val, mattr, "" ); #endif /* !NEW_LOGGING */ - free( a_vals[ j ]->bv_val ); - a_vals[ j ]->bv_val = mattr; - a_vals[ j ]->bv_len = strlen( mattr ); + free( a_vals->bv_val ); + a_vals->bv_val = mattr; + a_vals->bv_len = strlen( mattr ); break; diff --git a/servers/slapd/back-ldap/back-ldap.h b/servers/slapd/back-ldap/back-ldap.h index 4c7bbc2c50..f74d47b613 100644 --- a/servers/slapd/back-ldap/back-ldap.h +++ b/servers/slapd/back-ldap/back-ldap.h @@ -122,7 +122,7 @@ extern void mapping_free ( struct ldapmapping *mapping ); #ifdef ENABLE_REWRITE extern int suffix_massage_config( struct rewrite_info *info, int argc, char **argv ); -extern int ldap_dnattr_rewrite( struct rewrite_info *rwinfo, struct berval **a_vals, void *cookie ); +extern int ldap_dnattr_rewrite( struct rewrite_info *rwinfo, BVarray a_vals, void *cookie ); #endif /* ENABLE_REWRITE */ LDAP_END_DECL diff --git a/servers/slapd/back-meta/add.c b/servers/slapd/back-meta/add.c index 1c9a24afdf..07806e6ea8 100644 --- a/servers/slapd/back-meta/add.c +++ b/servers/slapd/back-meta/add.c @@ -149,6 +149,7 @@ meta_back_add( attrs = ch_malloc( sizeof( LDAPMod * )*i ); for ( i = 0, a = e->e_attrs; a; a = a->a_next ) { + int j; /* * lastmod should always be , so that * creation/modification operational attrs @@ -192,13 +193,18 @@ meta_back_add( a->a_vals, conn ); } - attrs[ i ]->mod_vals.modv_bvals = a->a_vals; + for (j=0; a->a_vals[ j ].bv_val; j++); + attrs[ i ]->mod_vals.modv_bvals = ch_malloc((j+1)*sizeof(struct berval *)); + for (j=0; a->a_vals[ j ].bv_val; j++) + attrs[ i ]->mod_vals.modv_bvals[ j ] = &a->a_vals[ j ]; + attrs[ i ]->mod_vals.modv_bvals[ j ] = NULL; i++; } attrs[ i ] = NULL; ldap_add_s( lc->conns[ candidate ]->ld, mdn.bv_val, attrs ); for ( --i; i >= 0; --i ) { + free( attrs[ i ]->mod_vals.modv_bvals ); free( attrs[ i ] ); } free( attrs ); diff --git a/servers/slapd/back-meta/modify.c b/servers/slapd/back-meta/modify.c index fd14b2d324..fb1b676e01 100644 --- a/servers/slapd/back-meta/modify.c +++ b/servers/slapd/back-meta/modify.c @@ -152,6 +152,7 @@ meta_back_modify( } for ( i = 0, ml = modlist; ml; ml = ml->sml_next ) { + int j; /* * lastmod should always be */ @@ -189,8 +190,13 @@ meta_back_modify( li->targets[ candidate ]->rwinfo, ml->sml_bvalues, conn ); } - - mods[ i ].mod_bvalues = ml->sml_bvalues; + + for (j = 0; ml->sml_bvalues[ j ].bv_val; j++); + mods[ i ].mod_bvalues = (struct berval **)ch_malloc((j+1) * + sizeof(struct berval *)); + for (j = 0; ml->sml_bvalues[ j ].bv_val; j++) + mods[ i ].mod_bvalues[ j ] = &ml->sml_bvalues[j]; + mods[ i ].mod_bvalues[ j ] = NULL; i++; } modv[ i ] = 0; @@ -200,6 +206,8 @@ meta_back_modify( if ( mdn != dn->bv_val ) { free( mdn ); } + for ( i=0; modv[ i ]; i++) + free( modv[ i ]->mod_bvalues ); free( mods ); free( modv ); return meta_back_op_result( lc, op ); -- 2.39.5