diff --git a/CHANGES b/CHANGES index 1ec8c27eab547af9eacbb9b877122855018a0062..b4750cd833d3bef959d0489d8882c3decc1c88b5 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ Changes included in OpenLDAP 1.1.2 Fixed slapd/nonauthorized add bug (ITS#26) Fixed misc. overlapping strcpy bugs Fixed misc. memory leaks + Update DB2 support for newer SleepyCat releases (ITS#27) Update slapd/slurpd to workaround FreeBSD pthread_exit bug (ITS#28) Build environment Fixed --disable-crypt/-disable-cleartext options diff --git a/include/ldbm.h b/include/ldbm.h index d1b93fb4a3403a54ad3573709401dec62d4f6e92..0a7edcdf13c36daf838cb13779804ea0bb95e02b 100644 --- a/include/ldbm.h +++ b/include/ldbm.h @@ -201,4 +201,16 @@ int ldbm_delete( LDBM ldbm, Datum key ); Datum ldbm_nextkey( LDBM ldbm, Datum key ); #endif + +/* initialization of Datum structures */ +#ifdef HAVE_BERKELEY_DB2 + +# define ldbm_datum_init(d) ((void)memset(&(d), 0, sizeof(Datum))) + +#else + +# define ldbm_datum_init(d) ((void)0) + +#endif /* HAVE_BERKELEY_DB2 */ + #endif /* _ldbm_h_ */ diff --git a/libraries/libldbm/ldbm.c b/libraries/libldbm/ldbm.c index 7a49e6b31cc4252fd0905ae7ddd90ce1e44530ec..72a212f8ca044c5b610197647da59b1382218437 100644 --- a/libraries/libldbm/ldbm.c +++ b/libraries/libldbm/ldbm.c @@ -54,7 +54,7 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize ) dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE; dbinfo.db_malloc = ldbm_malloc; - db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret ); + (void) db_open( name, DB_TYPE, rw, mode, NULL, &dbinfo, &ret ); #else void *info; @@ -107,14 +107,9 @@ ldbm_datum_dup( LDBM ldbm, Datum data ) { Datum dup; -#ifdef HAVE_BERKELEY_DB2 - memset( &dup, 0, sizeof( dup )); -#endif + ldbm_datum_init( dup ); if ( data.dsize == 0 ) { - dup.dsize = 0; - dup.dptr = NULL; - return( dup ); } dup.dsize = data.dsize; @@ -131,7 +126,7 @@ ldbm_fetch( LDBM ldbm, Datum key ) int rc; #ifdef HAVE_BERKELEY_DB2 - memset( &data, 0, sizeof( data )); + ldbm_datum_init( data ); data.flags = DB_DBT_MALLOC; @@ -160,6 +155,7 @@ ldbm_store( LDBM ldbm, Datum key, Datum data, int flags ) #else rc = (*ldbm->put)( ldbm, &key, &data, flags & ~LDBM_SYNC ); #endif + if ( flags & LDBM_SYNC ) (*ldbm->sync)( ldbm, 0 ); return( rc ); @@ -193,13 +189,24 @@ ldbm_firstkey( LDBM ldbm ) #ifdef HAVE_BERKELEY_DB2 DBC *dbci; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); key.flags = data.flags = DB_DBT_MALLOC; /* acquire a cursor for the DB */ + +# if defined( DB_VERSION_MAJOR ) && defined( DB_VERSION_MINOR ) && \ + DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 + if ( (*ldbm->cursor)( ldbm, NULL, &dbci )) { + +# else + + if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 )) { + +# endif + return( key ); } else { *dbch = dbci; @@ -234,7 +241,7 @@ ldbm_nextkey( LDBM ldbm, Datum key ) #ifdef HAVE_BERKELEY_DB2 void *oldKey = key.dptr; - memset( &data, 0, sizeof( data )); + ldbm_datum_init( data ); data.flags = DB_DBT_MALLOC; @@ -267,7 +274,7 @@ ldbm_errno( LDBM ldbm ) /***************************************************************** * * - * use gdbm * + * use gdbm * * * *****************************************************************/ diff --git a/servers/slapd/back-ldbm/dbcache.c b/servers/slapd/back-ldbm/dbcache.c index 4beef6dd6e32082585d2e8f3272ecaa2da6a3821..143ed07e3ee6378fbe279c0304f663dddd07d570 100644 --- a/servers/slapd/back-ldbm/dbcache.c +++ b/servers/slapd/back-ldbm/dbcache.c @@ -175,9 +175,8 @@ ldbm_cache_fetch( ) { Datum data; -#ifdef HAVE_BERKELEY_DB2 - memset( &data, 0, sizeof( data ) ); -#endif + + ldbm_datum_init( data ); pthread_mutex_lock( &db->dbc_mutex ); #ifdef reentrant_database diff --git a/servers/slapd/back-ldbm/dn2id.c b/servers/slapd/back-ldbm/dn2id.c index ca8c209b6ff9f59f3ef1b9deddf584832214eea6..92336d1ce0628a494e909e190327ccb4445a0784 100644 --- a/servers/slapd/back-ldbm/dn2id.c +++ b/servers/slapd/back-ldbm/dn2id.c @@ -23,10 +23,8 @@ dn2id_add( Datum key, data; struct ldbminfo *li = (struct ldbminfo *) be->be_private; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); Debug( LDAP_DEBUG_TRACE, "=> dn2id_add( \"%s\", %ld )\n", dn, id, 0 ); @@ -68,10 +66,8 @@ dn2id( ID id; Datum key, data; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); dn = ch_strdup( dn ); Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 ); @@ -125,9 +121,7 @@ dn2id_delete( Datum key; int rc; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\" )\n", dn, 0, 0 ); diff --git a/servers/slapd/back-ldbm/id2children.c b/servers/slapd/back-ldbm/id2children.c index 23e64f755946199124e05b0b2cccc2f84152502e..171e6c2618dd27b13adb3117297994de3c0dcb13 100644 --- a/servers/slapd/back-ldbm/id2children.c +++ b/servers/slapd/back-ldbm/id2children.c @@ -25,8 +25,9 @@ id2children_add( #ifdef HAVE_BERKELEY_DB2 Datum data; - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); + + ldbm_datum_init( key ); + ldbm_datum_init( data ); #endif Debug( LDAP_DEBUG_TRACE, "=> id2children_add( %lu, %lu )\n", @@ -82,7 +83,7 @@ id2children_remove( return( -1 ); } - memset( &key, 0, sizeof(key) ); + ldbm_datum_init( key ); sprintf( buf, "%c%ld", EQ_PREFIX, p ? p->e_id : 0 ); key.dptr = buf; key.dsize = strlen( buf ) + 1; @@ -112,9 +113,7 @@ has_children( IDList *idl; char buf[20]; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); Debug( LDAP_DEBUG_TRACE, "=> has_children( %lu )\n", p->e_id , 0, 0 ); diff --git a/servers/slapd/back-ldbm/id2entry.c b/servers/slapd/back-ldbm/id2entry.c index ab8ff238f1f9f177eb5fcd17ce13b3ea29c404b1..e42c1f0e511e8d704204c4f71b8fef202f98c8a3 100644 --- a/servers/slapd/back-ldbm/id2entry.c +++ b/servers/slapd/back-ldbm/id2entry.c @@ -17,10 +17,8 @@ id2entry_add( Backend *be, Entry *e ) Datum key, data; int len, rc, flags; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); Debug( LDAP_DEBUG_TRACE, "=> id2entry_add( %lu, \"%s\" )\n", e->e_id, e->e_dn, 0 ); @@ -71,9 +69,7 @@ id2entry_delete( Backend *be, Entry *e ) assert(pthread_rdwr_wchk_np(&e->e_rdwr)); #endif -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); /* XXX - check for writer lock - should also check no reader pending */ Debug (LDAP_DEBUG_TRACE, @@ -112,10 +108,8 @@ id2entry( Backend *be, ID id, int rw ) Datum key, data; Entry *e; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( key ); + ldbm_datum_init( data ); Debug( LDAP_DEBUG_TRACE, "=> id2entry_%s( %ld )\n", rw ? "w" : "r", id, 0 ); diff --git a/servers/slapd/back-ldbm/idl.c b/servers/slapd/back-ldbm/idl.c index 4e47e78ada806fb37dab32215625f83c9e981f81..ee5e3160714f76975594e2b89624192ea65c7366 100644 --- a/servers/slapd/back-ldbm/idl.c +++ b/servers/slapd/back-ldbm/idl.c @@ -58,8 +58,9 @@ idl_fetch_one( #ifdef HAVE_BERKELEY_DB2 Datum k2; - memset( &k2, 0, sizeof( k2 ) ); - memset( &data, 0, sizeof( data ) ); + + ldbm_datum_init( data ); + ldbm_datum_init( k2 ); #endif /* Debug( LDAP_DEBUG_TRACE, "=> idl_fetch_one\n", 0, 0, 0 ); */ @@ -84,10 +85,8 @@ idl_fetch( char *kstr; int i, nids; -#ifdef HAVE_BERKELEY_DB2 - memset( &k2, 0, sizeof( k2 ) ); - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( k2 ); + ldbm_datum_init( data ); /* Debug( LDAP_DEBUG_TRACE, "=> idl_fetch\n", 0, 0, 0 ); */ @@ -178,9 +177,7 @@ idl_store( Datum data; struct ldbminfo *li = (struct ldbminfo *) be->be_private; -#ifdef HAVE_BERKELEY_DB2 - memset( &data, 0, sizeof( data ) ); -#endif + ldbm_datum_init( data ); /* Debug( LDAP_DEBUG_TRACE, "=> idl_store\n", 0, 0, 0 ); */ @@ -300,9 +297,7 @@ idl_insert_key( char *kstr; Datum k2; -#ifdef HAVE_BERKELEY_DB2 - memset( &k2, 0, sizeof( k2 ) ); -#endif + ldbm_datum_init( k2 ); if ( (idl = idl_fetch_one( be, db, key )) == NULL ) { #ifdef LDBM_DEBUG @@ -664,7 +659,7 @@ idl_delete_key ( kstr = (char *) ch_malloc( key.dsize + 20 ); for ( j = 0; idl->b_ids[j] != NOID; j++ ) { - memset( &k2, 0, sizeof(k2) ); + ldbm_datum_init( k2 ); sprintf( kstr, "%c%s%ld", CONT_PREFIX, key.dptr, idl->b_ids[j] ); k2.dptr = kstr; k2.dsize = strlen( kstr ) + 1; diff --git a/servers/slapd/back-ldbm/index.c b/servers/slapd/back-ldbm/index.c index 5965ecf0eb45395cff58d875ddef6f7d97f23bdf..016be0644108895c329d9001321a243dd5240821 100644 --- a/servers/slapd/back-ldbm/index.c +++ b/servers/slapd/back-ldbm/index.c @@ -99,9 +99,7 @@ index_read( char *realval, *tmpval; char buf[BUFSIZ]; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); prefix = index2prefix( indextype ); Debug( LDAP_DEBUG_TRACE, "=> index_read( \"%s\" \"%c\" \"%s\" )\n", @@ -173,9 +171,7 @@ add_value( char *realval, *tmpval, *s; char buf[BUFSIZ]; -#ifdef HAVE_BERKELEY_DB2 - memset( &key, 0, sizeof( key ) ); -#endif + ldbm_datum_init( key ); prefix = index2prefix( indextype ); Debug( LDAP_DEBUG_TRACE, "=> add_value( \"%c%s\" )\n", prefix, val, 0 ); diff --git a/servers/slapd/tools/centipede.c b/servers/slapd/tools/centipede.c index d66490eba117d75438a54d6fa9d860567e4236bb..306203427843922e4f48f4f862f0478ea9a0539f 100644 --- a/servers/slapd/tools/centipede.c +++ b/servers/slapd/tools/centipede.c @@ -474,7 +474,7 @@ generate_new_centroids( char **val; char last; - memset( &data, 0 , sizeof( data )); + ldbm_datum_init( data ); if ( verbose ) { printf( "Generating new centroids for..." ); @@ -499,7 +499,7 @@ generate_new_centroids( /* for each value */ for ( j = 0; val[j] != NULL; j++ ) { - memset( &key, 0 , sizeof( key )); + ldbm_datum_init( key ); /* normalize the value */ for ( s = val[j]; *s; s++ ) { @@ -576,13 +576,13 @@ diff_centroids( fflush( stdout ); } - memset( &okey, 0, sizeof( okey )); - memset( &nkey, 0, sizeof( nkey )); - memset( &olast, 0, sizeof( olast )); - memset( &nlast, 0, sizeof( nlast )); - memset( &lastkey, 0, sizeof( lastkey )); - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( okey ); + ldbm_datum_init( nkey ); + ldbm_datum_init( olast ); + ldbm_datum_init( nlast ); + ldbm_datum_init( lastkey ); + ldbm_datum_init( key ); + ldbm_datum_init( data ); if ( (mods = (LDAPMod **) malloc( sizeof(LDAPMod *) * 4 )) == NULL || (mods[0] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL || @@ -846,8 +846,8 @@ full_centroid( fflush( stdout ); } - memset( &key, 0, sizeof( key )); - memset( &lastkey, 0, sizeof( lastkey )); + ldbm_datum_init( key ); + ldbm_datum_init( lastkey ); if ( (mods = (LDAPMod **) malloc( sizeof(LDAPMod *) * 3 )) == NULL || (mods[0] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL || diff --git a/servers/slapd/tools/ldbmcat.c b/servers/slapd/tools/ldbmcat.c index 658bf98906edc775295b08349c76001c73c3b8bd..6f2ea10340408580698a40755fd9ce91aeee7ecc 100644 --- a/servers/slapd/tools/ldbmcat.c +++ b/servers/slapd/tools/ldbmcat.c @@ -12,43 +12,43 @@ static void usage( char *name ) { - fprintf( stderr, "usage: %s [-n] <filename>\n", name ); - exit( 1 ); + fprintf( stderr, "usage: %s [-n] <filename>\n", name ); + exit( 1 ); } int main( int argc, char **argv ) { - Datum key, last, data; - LDBM dbp; - int rc, type; - long id; - char *file, *s; - int printid = 1; + Datum key, last, data; + LDBM dbp; + int rc, type; + long id; + char *file, *s; + int printid = 1; #ifdef HAVE_BERKELEY_DB2 - DBC *cursorp; + DBC *cursorp; - memset( &key, 0, sizeof( key )); - memset( &last, 0, sizeof( last )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( last ); + ldbm_datum_init( data ); #endif - if ( argc < 2 || argc > 3 || ( argc == 3 && strcmp( argv[1], "-n" ) - != 0 )) { - usage( argv[0] ); - } - if ( argc == 3 && strcmp( argv[1], "-n" ) == 0 ) { - printid = 0; - file = argv[2]; - } else { - file = argv[1]; - } - - if ( (dbp = ldbm_open( file, LDBM_READER, 0, 0 )) == NULL ) { - perror( file ); - exit ( 1 ); - } + if ( argc < 2 || argc > 3 || ( argc == 3 && strcmp( argv[1], "-n" ) + != 0 )) { + usage( argv[0] ); + } + if ( argc == 3 && strcmp( argv[1], "-n" ) == 0 ) { + printid = 0; + file = argv[2]; + } else { + file = argv[1]; + } + + if ( (dbp = ldbm_open( file, LDBM_READER, 0, 0 )) == NULL ) { + perror( file ); + exit ( 1 ); + } last.dptr = NULL; @@ -59,25 +59,33 @@ main( int argc, char **argv ) for ( key = ldbm_firstkey( dbp ); key.dptr != NULL; key = ldbm_nextkey( dbp, last ) ) #endif - { + { if ( last.dptr != NULL ) ldbm_datum_free( dbp, last ); data = ldbm_fetch( dbp, key ); - s = data.dptr; - if ( !printid && isdigit( *s )) { - if (( s = strchr( s, '\n' )) != NULL ) { - ++s; - } - } - if ( s != NULL ) { - puts( s ); - } - ldbm_datum_free( dbp, data ); + + if (( s = data.dptr ) != NULL ) { + + if ( !printid && isdigit( *s )) { + if (( s = strchr( s, '\n' )) != NULL ) { + ++s; + } + } + if ( s != NULL ) { + puts( s ); + } + + if ( data.dptr != NULL ) { + ldbm_datum_free( dbp, data ); + } + + } + last = key; } if ( last.dptr != NULL ) ldbm_datum_free( dbp, last ); - ldbm_close( dbp ); + ldbm_close( dbp ); - exit( 0 ); + exit( 0 ); } diff --git a/servers/slapd/tools/ldbmtest.c b/servers/slapd/tools/ldbmtest.c index 5978e91e1a20e6ad4a29e168658acd17e1fe2715..0868b97d0c7b9f5ede3db0ae0524bc56be28e3ef 100644 --- a/servers/slapd/tools/ldbmtest.c +++ b/servers/slapd/tools/ldbmtest.c @@ -70,10 +70,10 @@ main( int argc, char **argv ) #ifdef HAVE_BERKELEY_DB2 DBC *cursorp; - memset( &savekey, 0, sizeof( savekey )); - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); - memset( &last, 0, sizeof( last )); + ldbm_datum_init( savekey ); + ldbm_datum_init( key ); + ldbm_datum_init( data ); + ldbm_datum_init( last ); #endif tailorfile = SLAPD_DEFAULT_CONFIGFILE; @@ -187,7 +187,9 @@ main( int argc, char **argv ) "key: ", NULL, NULL ); } - ldbm_datum_free( dbc->dbc_db, data ); + if ( data.dptr != NULL ) { + ldbm_datum_free( dbc->dbc_db, data ); + } } if ( savekey.dptr != NULL ) ldbm_datum_free( dbc->dbc_db, savekey ); @@ -565,7 +567,9 @@ edit_entry( char c, Datum *data ) perror( tmpname ); return; } - ldbm_datum_free( NULL, *data ); + if ( data->dptr != NULL ) { + ldbm_datum_free( NULL, *data ); + } get_keydata( fp, c, NULL, data ); fclose( fp ); unlink( tmpname ); diff --git a/servers/slapd/tools/ldif2id2children.c b/servers/slapd/tools/ldif2id2children.c index 7877f659277229f599f27d2fabc6282ca355c61e..07e2b616382818d52729f3c634db5d167e455fcf 100644 --- a/servers/slapd/tools/ldif2id2children.c +++ b/servers/slapd/tools/ldif2id2children.c @@ -155,8 +155,8 @@ main( int argc, char **argv ) int vlen; Datum key, data; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); if ( fgets( line, sizeof(line), stdin ) != NULL ) { int len; @@ -243,8 +243,8 @@ main( int argc, char **argv ) char buf2[20]; Datum key, data; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); if ( fgets( line, sizeof(line), stdin ) != NULL ) { int len; diff --git a/servers/slapd/tools/ldif2id2entry.c b/servers/slapd/tools/ldif2id2entry.c index a34eb0a553aa426346a3309f251199cb40978f07..391988207f5e8e448536df38489e7e43a20e9ee6 100644 --- a/servers/slapd/tools/ldif2id2entry.c +++ b/servers/slapd/tools/ldif2id2entry.c @@ -147,8 +147,8 @@ main( int argc, char **argv ) int vlen; Datum key, data; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); if ( fgets( line, sizeof(line), stdin ) != NULL ) { int len, idlen; diff --git a/servers/slapd/tools/ldif2ldbm.c b/servers/slapd/tools/ldif2ldbm.c index 41b93676b0167f4fa4dab41071e2282a22fdef50..c55cd20c3a02a9f45b885f9b8df55ff244406d72 100644 --- a/servers/slapd/tools/ldif2ldbm.c +++ b/servers/slapd/tools/ldif2ldbm.c @@ -230,8 +230,8 @@ main( int argc, char **argv ) int vlen, indexmask, syntaxmask; Datum key, data; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); if ( fgets( line, sizeof(line), stdin ) != NULL ) { int len; diff --git a/servers/slapd/tools/sizecount.c b/servers/slapd/tools/sizecount.c index f4ed1f4a66c48be81b58755e0d8916f6babe64d1..fa1765da80ec6ec37ee0194a937af68a8b483e1b 100644 --- a/servers/slapd/tools/sizecount.c +++ b/servers/slapd/tools/sizecount.c @@ -94,8 +94,8 @@ main( int argc, char **argv ) Datum key, data; char *w; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); /* update value count */ vcount++; @@ -179,8 +179,8 @@ add( { Datum key, data; - memset( &key, 0, sizeof( key )); - memset( &data, 0, sizeof( data )); + ldbm_datum_init( key ); + ldbm_datum_init( data ); key.dptr = s; key.dsize = strlen( key.dptr ) + 1; @@ -190,6 +190,6 @@ add( (*count)++; (*size) += strlen( key.dptr ); } - if ( freeit ) + if ( freeit && ( key.dptr != NULL ) ) ldbm_datum_free( ldbm, key ); }