#include "slap.h"
#include "back-ldap.h"
+#include "lutil.h"
int
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 */
}
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 );
}
" \"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
* 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 ... */
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 );
}
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 )
}
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,
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 );
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;
}
* 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;
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 */