]> git.sur5r.net Git - openldap/commitdiff
BVarray fixes for ldap_dnattr_rewrite
authorHoward Chu <hyc@openldap.org>
Sat, 5 Jan 2002 11:41:23 +0000 (11:41 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 5 Jan 2002 11:41:23 +0000 (11:41 +0000)
servers/slapd/back-ldap/add.c
servers/slapd/back-ldap/back-ldap.h
servers/slapd/back-meta/add.c
servers/slapd/back-meta/modify.c

index 668c22167cf9cc8995b0a4ba8d4b25f02c7aa77f..7dfcd9ad0897fafce4220b561e09c74d7ad98fe7 100644 (file)
@@ -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;
                        
index 4c7bbc2c50f684bb8ae6b5e064b8f87045f497a3..f74d47b613177243d3d56d22efd8f42faccd78c6 100644 (file)
@@ -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
index 1c9a24afdfe82cba25eb524035b407197c5b41a4..07806e6ea848d32255b50f756ef2ae1b9ef45557 100644 (file)
@@ -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 <off>, 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 );
index fd14b2d324e0ff1598a5d58624a667c9ddf0bc28..fb1b676e01ab319c7cfd2aac251feb7403ad5262 100644 (file)
@@ -152,6 +152,7 @@ meta_back_modify(
        }
 
        for ( i = 0, ml = modlist; ml; ml = ml->sml_next ) {
+               int j;
                /*
                 * lastmod should always be <off>
                 */
@@ -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 );