]> git.sur5r.net Git - openldap/commitdiff
Fix attrs handling
authorHoward Chu <hyc@openldap.org>
Wed, 26 Dec 2001 09:19:57 +0000 (09:19 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 26 Dec 2001 09:19:57 +0000 (09:19 +0000)
servers/slapd/back-ldap/back-ldap.h
servers/slapd/back-ldap/config.c
servers/slapd/back-ldap/search.c
servers/slapd/back-tcl/tcl_search.c

index 45fb33bea6074df2c6e7aeaae0fffac5c608025d..c9c16ac716a6e0095fce059cd707ddc8c0d487d7 100644 (file)
@@ -112,7 +112,7 @@ ldap_back_map_filter(
 char **
 ldap_back_map_attrs(
                struct ldapmap *at_map,
-               char **a,
+               struct berval **a,
                int remap
 );
 
index 605a16ab2f621532e3456dc1c24a9f7674ca8c5e..425ef251da78487c9e34124396592ca43d27f491 100644 (file)
@@ -117,6 +117,7 @@ ldap_back_db_config(
                char *dn, *massaged_dn;
 #endif /* ENABLE_REWRITE */
                BackendDB *tmp_be;
+               struct berval bdn, *ndn = NULL;
                
                /*
                 * syntax:
@@ -137,7 +138,16 @@ ldap_back_db_config(
                        return( 1 );
                }
                
-               tmp_be = select_backend( argv[1], 0, 0 );
+               bdn.bv_val = argv[1];
+               bdn.bv_len = strlen(bdn.bv_val);
+               if ( dnNormalize( NULL, &bdn, &ndn ) != LDAP_SUCCESS ) {
+                       fprintf( stderr, "%s: line %d: suffix DN %s is invalid\n",
+                               fname, lineno, bdn.bv_val );
+                       return( 1 );
+               }
+               tmp_be = select_backend( ndn, 0, 0 );
+               ber_bvfree( ndn );
+               ndn = NULL;
                if ( tmp_be != NULL && tmp_be != be ) {
                        fprintf( stderr, "%s: line %d: suffix already in use"
                                       " by another backend in"
@@ -147,7 +157,15 @@ ldap_back_db_config(
                        return( 1 );                                            
                }
 
-               tmp_be = select_backend( argv[2], 0, 0 );
+               bdn.bv_val = argv[2];
+               bdn.bv_len = strlen(bdn.bv_val);
+               if ( dnNormalize( NULL, &bdn, &ndn ) != LDAP_SUCCESS ) {
+                       fprintf( stderr, "%s: line %d: suffix DN %s is invalid\n",
+                               fname, lineno, bdn.bv_val );
+                       return( 1 );
+               }
+               tmp_be = select_backend( ndn, 0, 0 );
+               ber_bvfree( ndn );
                if ( tmp_be != NULL ) {
                        fprintf( stderr, "%s: line %d: massaged suffix"
                                       " already in use by another backend in" 
@@ -413,12 +431,12 @@ ldap_back_map_filter(
 char **
 ldap_back_map_attrs(
                struct ldapmap *at_map,
-               char **a,
+               struct berval **a,
                int remap
 )
 {
        int i, j, count;
-       char **na, *mapped;
+       char *mapped, **na;
 
        if (a == NULL)
                return(NULL);
@@ -432,13 +450,8 @@ ldap_back_map_attrs(
                return(NULL);
 
        for (i = 0, j = 0; i < count; i++) {
-               mapped = ldap_back_map(at_map, a[i], remap);
+               mapped = ldap_back_map(at_map, a[i]->bv_val, remap);
                if (mapped != NULL) {
-                       mapped = ch_strdup(mapped);
-                       if (mapped == NULL) {
-                               charray_free(na);
-                               return(NULL);
-                       }
                        na[j] = mapped;
                        j++;
                }
index 8ede770591efaf79d712e6a7710491fb0964307b..14dadd3d17d9d20d436a6653cd26543463230fcc 100644 (file)
@@ -221,8 +221,13 @@ ldap_back_search(
        }
 
        mapped_attrs = ldap_back_map_attrs(&li->at_map, attrs, 0);
-       if ( mapped_attrs == NULL ) {
-               mapped_attrs = attrs;
+       if ( mapped_attrs == NULL && attrs) {
+               for (count=0; attrs[count]; count++);
+               mapped_attrs = ch_malloc( (count+1) * sizeof(char *));
+               for (count=0; attrs[count]; count++) {
+                       mapped_attrs[count] = attrs[count]->bv_val;
+               }
+               mapped_attrs[count] = NULL;
        }
 
        if ((msgid = ldap_search(lc->ld, mbase, scope, mapped_filter, mapped_attrs,
@@ -330,8 +335,8 @@ finish:;
        if ( err ) {
                free( err );
        }
-       if ( mapped_attrs != attrs ) {
-               charray_free( mapped_attrs );
+       if ( mapped_attrs ) {
+               free( mapped_attrs );
        }
 #ifdef ENABLE_REWRITE
        if ( mapped_filter != mfilter ) {
index 3f557d47578ef1f0b2e023eeeb5d4951ea45af2c..6f689da5a7fd4972a82d8b3453587149812bee63 100644 (file)
@@ -45,11 +45,14 @@ tcl_back_search (
                return (-1);
        }
 
-       for (i = 0; attrs != NULL && attrs[i] != NULL; i++)
-               charray_add(&sattrs, attrs[i]->bv_val);
+       for (i = 0; attrs != NULL && attrs[i] != NULL; i++);
        if (i > 0) {
+               sattrs = ch_malloc( (i+1) * sizeof(char *));
+               for (i = 0; attrs[i]; i++)
+                       sattrs[i] = attrs[i]->bv_val;
+               sattrs[i] = NULL;
                attrs_tcl = Tcl_Merge (i, sattrs);
-               charray_free(sattrs);
+               free(sattrs);
        }
 
        for (i = 0; be->be_suffix[i] != NULL; i++);