]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/config.c
Cleanup up LDAP_CLIENT_UPDATE code... including some bug fixing.
[openldap] / servers / slapd / back-ldap / config.c
index 6df5ff97e260f64f175dc47bf6761cac9321a6ea..42e44659bfd049f8a02f4155f16d5227871b39f9 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "slap.h"
 #include "back-ldap.h"
+#include "lutil.h"
 
 int
 ldap_back_db_config(
@@ -124,8 +125,7 @@ ldap_back_db_config(
        /* dn massaging */
        } else if ( strcasecmp( argv[0], "suffixmassage" ) == 0 ) {
                BackendDB *tmp_be;
-               struct berval bvnc, *nvnc = NULL, *pvnc = NULL, 
-                       brnc, *nrnc = NULL, *prnc = NULL;
+               struct berval bvnc, nvnc, pvnc, brnc, nrnc, prnc;
 #ifdef ENABLE_REWRITE
                int rc;
 #endif /* ENABLE_REWRITE */
@@ -150,33 +150,29 @@ ldap_back_db_config(
                }
                
                ber_str2bv( argv[1], 0, 0, &bvnc );
-               pvnc = (struct berval *)ber_memalloc( sizeof( struct berval ) );
-               nvnc = (struct berval *)ber_memalloc( sizeof( struct berval ) );
-               if ( dnPrettyNormal( NULL, &bvnc, pvnc, nvnc ) != LDAP_SUCCESS ) {
+               if ( dnPrettyNormal( NULL, &bvnc, &pvnc, &nvnc ) != LDAP_SUCCESS ) {
                        fprintf( stderr, "%s: line %d: suffix DN %s is invalid\n",
                                fname, lineno, bvnc.bv_val );
                        return( 1 );
                }
-               tmp_be = select_backend( nvnc, 0, 0 );
+               tmp_be = select_backend( &nvnc, 0, 0 );
                if ( tmp_be != NULL && tmp_be != be ) {
                        fprintf( stderr, "%s: line %d: suffix already in use"
                                       " by another backend in"
                                       " \"suffixMassage <suffix>"
                                       " <massaged suffix>\"\n",
                                fname, lineno );
-                       ber_bvfree( nvnc );
-                       ber_bvfree( pvnc );
+                       free( nvnc.bv_val );
+                       free( pvnc.bv_val );
                        return( 1 );
                }
 
                ber_str2bv( argv[2], 0, 0, &brnc );
-               prnc = (struct berval *)ber_memalloc( sizeof( struct berval ) );
-               nrnc = (struct berval *)ber_memalloc( sizeof( struct berval ) );
-               if ( dnPrettyNormal( NULL, &brnc, prnc, nrnc ) != LDAP_SUCCESS ) {
+               if ( dnPrettyNormal( NULL, &brnc, &prnc, &nrnc ) != LDAP_SUCCESS ) {
                        fprintf( stderr, "%s: line %d: suffix DN %s is invalid\n",
                                fname, lineno, brnc.bv_val );
-                       ber_bvfree( nvnc );
-                       ber_bvfree( pvnc );
+                       free( nvnc.bv_val );
+                       free( pvnc.bv_val );
                        return( 1 );
                }
 
@@ -188,10 +184,10 @@ ldap_back_db_config(
                                       " \"suffixMassage <suffix>"
                                       " <massaged suffix>\"\n",
                                 fname, lineno );
-                       ber_bvfree( nvnc );
-                       ber_bvfree( pvnc );
-                       ber_bvfree( nrnc );
-                       ber_bvfree( prnc );
+                       free( nvnc.bv_val );
+                       free( pvnc.bv_val );
+                       free( nrnc.bv_val );
+                       free( prnc.bv_val );
                         return( 1 );
                }
 #endif
@@ -203,21 +199,20 @@ ldap_back_db_config(
                 * FIXME: no extra rewrite capabilities should be added
                 * to the database
                 */
-               rc = suffix_massage_config( li->rwinfo, pvnc, nvnc, prnc, nrnc );
-
-               ber_bvfree( nvnc );
-               ber_bvfree( pvnc );
-               ber_bvfree( nrnc );
-               ber_bvfree( prnc );
+               rc = suffix_massage_config( li->rwinfo, &pvnc, &nvnc, &prnc, &nrnc );
+               free( nvnc.bv_val );
+               free( pvnc.bv_val );
+               free( nrnc.bv_val );
+               free( prnc.bv_val );
 
                return( rc );
 
 #else /* !ENABLE_REWRITE */
-               ber_bvarray_add( &li->suffix_massage, pvnc );
-               ber_bvarray_add( &li->suffix_massage, nvnc );
+               ber_bvarray_add( &li->suffix_massage, &pvnc );
+               ber_bvarray_add( &li->suffix_massage, &nvnc );
                
-               ber_bvarray_add( &li->suffix_massage, prnc );
-               ber_bvarray_add( &li->suffix_massage, nrnc );
+               ber_bvarray_add( &li->suffix_massage, &prnc );
+               ber_bvarray_add( &li->suffix_massage, &nrnc );
 #endif /* !ENABLE_REWRITE */
 
        /* rewrite stuff ... */
@@ -238,7 +233,7 @@ ldap_back_db_config(
 
                if ( argc < 3 || argc > 4 ) {
                        fprintf( stderr,
-       "%s: line %d: syntax is \"map {objectclass | attribute} {<source> | *} [<dest> | *]\"\n",
+       "%s: line %d: syntax is \"map {objectclass | attribute} [<local> | *] {<foreign> | *}\"\n",
                                fname, lineno );
                        return( 1 );
                }
@@ -249,32 +244,24 @@ ldap_back_db_config(
                        map = &li->at_map;
                } else {
                        fprintf( stderr, "%s: line %d: syntax is "
-                               "\"map {objectclass | attribute} {<source> | *} "
-                                       "[<dest> | *]\"\n",
+                               "\"map {objectclass | attribute} [<local> | *] "
+                               "{<foreign> | *}\"\n",
                                fname, lineno );
                        return( 1 );
                }
 
-               if ( strcasecmp( argv[2], "*" ) != 0 ) {
-                       src = argv[2];
-                       if ( argc < 4 )
-                               dst = "";
-                       else if ( strcasecmp( argv[3], "*" ) == 0 )
-                               dst = src;
-                       else
-                               dst = argv[3];
-               } else {
-                       if ( argc < 4 ) {
-                               map->drop_missing = 1;
-                               return 0;
-                       }
-                       if ( strcasecmp( argv[3], "*" ) == 0 ) {
-                               map->drop_missing = 0;
+               if ( strcmp( argv[2], "*" ) == 0 ) {
+                       if ( argc < 4 || strcmp( argv[3], "*" ) == 0 ) {
+                               map->drop_missing = ( argc < 4 );
                                return 0;
                        }
-
-                       src = argv[3];
-                       dst = src;
+                       src = dst = argv[3];
+               } else if ( argc < 4 ) {
+                       src = "";
+                       dst = argv[2];
+               } else {
+                       src = argv[2];
+                       dst = ( strcmp( argv[3], "*" ) == 0 ? src : argv[3] );
                }
 
                if ( ( map == &li->at_map )
@@ -296,15 +283,11 @@ ldap_back_db_config(
                }
                ber_str2bv( src, 0, 1, &mapping->src );
                ber_str2bv( dst, 0, 1, &mapping->dst );
-               if ( *dst != 0 ) {
-                       mapping[1].src = mapping->dst;
-                       mapping[1].dst = mapping->src;
-               } else {
-                       mapping[1].src = mapping->src;
-                       mapping[1].dst = mapping->dst;
-               }
+               mapping[1].src = mapping->dst;
+               mapping[1].dst = mapping->src;
 
-               if ( avl_find( map->map, (caddr_t)mapping, mapping_cmp ) != NULL ||
+               if ( (*src != '\0' &&
+                         avl_find( map->map, (caddr_t)mapping, mapping_cmp ) != NULL) ||
                        avl_find( map->remap, (caddr_t)&mapping[1], mapping_cmp ) != NULL)
                {
                        fprintf( stderr,
@@ -313,8 +296,9 @@ ldap_back_db_config(
                        return 0;
                }
 
-               avl_insert( &map->map, (caddr_t)mapping,
-                                       mapping_cmp, mapping_dup );
+               if ( *src != '\0' )
+                       avl_insert( &map->map, (caddr_t)mapping,
+                                               mapping_cmp, mapping_dup );
                avl_insert( &map->remap, (caddr_t)&mapping[1],
                                        mapping_cmp, mapping_dup );
 
@@ -342,18 +326,18 @@ suffix_massage_regexize( const char *s )
 
        res = ch_calloc( sizeof( char ), strlen( s ) + 4 + 4*i + 1 );
 
-       ptr = slap_strcopy( res, "(.*)" );
+       ptr = lutil_strcopy( res, "(.*)" );
        for ( i = 0, p = s;
                        ( r = strchr( p, ',' ) ) != NULL;
                        p = r + 1 , i++ ) {
-               ptr = slap_strncopy( ptr, p, r - p + 1 );
-               ptr = slap_strcopy( ptr, "[ ]?" );
+               ptr = lutil_strncopy( ptr, p, r - p + 1 );
+               ptr = lutil_strcopy( ptr, "[ ]?" );
 
                if ( r[ 1 ] == ' ' ) {
                        r++;
                }
        }
-       slap_strcopy( ptr, p );
+       lutil_strcopy( ptr, p );
 
        return res;
 }
@@ -447,10 +431,40 @@ suffix_massage_config(
                 * walk the filter looking for DN-valued attributes,
                 * and only rewrite those that require rewriting
                 */
-               char vbuf[LDAP_FILT_MAXSIZ], rbuf[LDAP_FILT_MAXSIZ];
+               char    vbuf_[BUFSIZ], *vbuf = vbuf_,
+                       rbuf_[BUFSIZ], *rbuf = rbuf_;
+               int     len;
+
+               len = snprintf( vbuf, sizeof( vbuf_ ), 
+                               "(.*)%s\\)(.*)", nvnc->bv_val );
+               if ( len == -1 ) {
+                       /* 
+                        * traditional behavior: snprintf returns -1 
+                        * if buffer is insufficient
+                        */
+                       return -1;
+
+               } else if ( len >= sizeof( vbuf_ ) ) {
+                       /* 
+                        * C99: snprintf returns the required size 
+                        */
+                       vbuf = ch_malloc( len + 1 );
+                       len = snprintf( vbuf, len,
+                                       "(.*)%s\\)(.*)", nvnc->bv_val );
+                       assert( len > 0 );
+               }
 
-               snprintf( vbuf, sizeof( vbuf ), "(.*)%s\\)(.*)", nvnc->bv_val );
-               snprintf( rbuf, sizeof( rbuf ), "%%1%s)%%2", nrnc->bv_val );
+               len = snprintf( rbuf, sizeof( rbuf_ ), "%%1%s)%%2", 
+                               nrnc->bv_val );
+               if ( len == -1 ) {
+                       return -1;
+
+               } else if ( len >= sizeof( rbuf_ ) ) {
+                       rbuf = ch_malloc( len + 1 );
+                       len = snprintf( rbuf, sizeof( rbuf_ ), "%%1%s)%%2", 
+                                       nrnc->bv_val );
+                       assert( len > 0 );
+               }
                
                rargv[ 0 ] = "rewriteRule";
                rargv[ 1 ] = vbuf;
@@ -458,6 +472,14 @@ suffix_massage_config(
                rargv[ 3 ] = ":";
                rargv[ 4 ] = NULL;
                rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );
+
+               if ( vbuf != vbuf_ ) {
+                       ch_free( vbuf );
+               }
+
+               if ( rbuf != rbuf_ ) {
+                       ch_free( rbuf );
+               }
        }
 #endif /* rewrite filters */