1. Fix of ldbmcat segmentation fault bug (ITS#85 and #81).

2. Make ldbm_Env a failure-safe entity.
This commit is contained in:
Kurt Spanier 1999-03-05 11:24:42 +00:00
parent 3f76ee7a0b
commit 6da27229d9
3 changed files with 37 additions and 32 deletions

View file

@ -204,9 +204,6 @@ LDAP_BEGIN_DECL
int ldbm_initialize( void ); int ldbm_initialize( void );
int ldbm_shutdown( void ); int ldbm_shutdown( void );
#if HAVE_BERKELEY_DB2
extern DB_ENV ldbm_Env;
#endif
int ldbm_errno( LDBM ldbm ); int ldbm_errno( LDBM ldbm );
LDBM ldbm_open( char *name, int rw, int mode, int dbcachesize ); LDBM ldbm_open( char *name, int rw, int mode, int dbcachesize );

View file

@ -23,8 +23,11 @@
void void
ldbm_datum_free( LDBM ldbm, Datum data ) ldbm_datum_free( LDBM ldbm, Datum data )
{ {
free( data.dptr ); if ( data.dptr ) {
data.dptr = NULL; free( data.dptr );
data.dptr = NULL;
data.size = 0;
}
} }
@ -33,6 +36,8 @@ ldbm_datum_dup( LDBM ldbm, Datum data )
{ {
Datum dup; Datum dup;
ldbm_datum_init( dup );
if ( data.dsize == 0 ) { if ( data.dsize == 0 ) {
dup.dsize = 0; dup.dsize = 0;
dup.dptr = NULL; dup.dptr = NULL;
@ -96,7 +101,8 @@ ldbm_db_errcall( const char *prefix, char *message )
} }
/* a dbEnv for BERKELEYv2 */ /* a dbEnv for BERKELEYv2 */
DB_ENV ldbm_Env; static DB_ENV ldbm_Env_internal;
DB_ENV *ldbm_Env = NULL;
/* Berkeley DB 2.x is reentrant */ /* Berkeley DB 2.x is reentrant */
#define LDBM_LOCK ((void)0) #define LDBM_LOCK ((void)0)
@ -109,14 +115,15 @@ int ldbm_initialize( void )
if(ldbm_initialized++) return 1; if(ldbm_initialized++) return 1;
memset( &ldbm_Env, 0, sizeof( ldbm_Env )); memset( &ldbm_Env_internal, 0, sizeof( DB_ENV ));
ldbm_Env = &ldbm_Env_internal;
ldbm_Env.db_errcall = ldbm_db_errcall; ldbm_Env->db_errcall = ldbm_db_errcall;
ldbm_Env.db_errpfx = "==>"; ldbm_Env->db_errpfx = "==>";
envFlags = DB_CREATE | DB_THREAD; envFlags = DB_CREATE | DB_THREAD;
if ( ( err = db_appinit( NULL, NULL, &ldbm_Env, envFlags )) ) { if ( ( err = db_appinit( NULL, NULL, ldbm_Env, envFlags )) ) {
char error[BUFSIZ]; char error[BUFSIZ];
if ( err < 0 ) { if ( err < 0 ) {
@ -138,7 +145,7 @@ int ldbm_shutdown( void )
{ {
if( !ldbm_initialized ) return 1; if( !ldbm_initialized ) return 1;
db_appexit( &ldbm_Env ); db_appexit( ldbm_Env );
return 0; return 0;
} }
@ -162,13 +169,13 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
DB_INFO dbinfo; DB_INFO dbinfo;
memset( &dbinfo, 0, sizeof( dbinfo )); memset( &dbinfo, 0, sizeof( dbinfo ));
if ( ldbm_Env.mp_info == NULL ) if (( ldbm_Env == NULL ) || ( ldbm_Env->mp_info == NULL ))
dbinfo.db_cachesize = dbcachesize; dbinfo.db_cachesize = dbcachesize;
dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE; dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE;
dbinfo.db_malloc = ldbm_malloc; dbinfo.db_malloc = ldbm_malloc;
LDBM_LOCK; LDBM_LOCK;
(void) db_open( name, DB_TYPE, rw, mode, &ldbm_Env, &dbinfo, &ret ); (void) db_open( name, DB_TYPE, rw, mode, ldbm_Env, &dbinfo, &ret );
LDBM_UNLOCK; LDBM_UNLOCK;
#else #else
@ -231,7 +238,7 @@ ldbm_fetch( LDBM ldbm, Datum key )
data.flags = DB_DBT_MALLOC; data.flags = DB_DBT_MALLOC;
if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) { if ( (rc = (*ldbm->get)( ldbm, NULL, &key, &data, 0 )) != 0 ) {
if ( data.dptr ) free( data.dptr ); ldbm_datum_free( ldbm, data );
#else #else
if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) { if ( (rc = (*ldbm->get)( ldbm, &key, &data, 0 )) == 0 ) {
/* Berkeley DB 1.85 don't malloc the data for us */ /* Berkeley DB 1.85 don't malloc the data for us */
@ -320,13 +327,13 @@ ldbm_firstkey( LDBM ldbm )
if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 )) if ( (*ldbm->cursor)( ldbm, NULL, &dbci, 0 ))
# endif # endif
{ {
key.flags = 0;
key.dptr = NULL;
return( key ); return( key );
} else { } else {
*dbch = dbci; *dbch = dbci;
if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) { if ( (*dbci->c_get)( dbci, &key, &data, DB_NEXT ) == 0 ) {
if ( data.dptr ) { ldbm_datum_free( ldbm, data );
free( data.dptr );
}
} }
#else #else
int rc; int rc;
@ -338,6 +345,7 @@ ldbm_firstkey( LDBM ldbm )
} }
#endif #endif
else { else {
key.flags = 0;
key.dptr = NULL; key.dptr = NULL;
key.dsize = 0; key.dsize = 0;
} }
@ -361,16 +369,15 @@ ldbm_nextkey( LDBM ldbm, Datum key )
Datum data; Datum data;
#ifdef HAVE_BERKELEY_DB2 #ifdef HAVE_BERKELEY_DB2
void *oldKey = key.dptr;
ldbm_datum_init( data ); ldbm_datum_init( data );
data.flags = DB_DBT_MALLOC; ldbm_datum_free( ldbm, key );
key.flags = data.flags = DB_DBT_MALLOC;
LDBM_LOCK; LDBM_LOCK;
if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) { if ( (*dbcp->c_get)( dbcp, &key, &data, DB_NEXT ) == 0 ) {
if ( data.dptr ) free( data.dptr ); ldbm_datum_free( ldbm, data );
} }
#else #else
int rc; int rc;
@ -382,16 +389,13 @@ ldbm_nextkey( LDBM ldbm, Datum key )
} }
#endif #endif
else { else {
key.flags = 0;
key.dptr = NULL; key.dptr = NULL;
key.dsize = 0; key.dsize = 0;
} }
LDBM_UNLOCK; LDBM_UNLOCK;
#ifdef HAVE_BERKELEY_DB2
if ( oldKey ) free( oldKey );
#endif
return( key ); return( key );
} }

View file

@ -26,6 +26,8 @@ main( int argc, char **argv )
#ifdef HAVE_BERKELEY_DB2 #ifdef HAVE_BERKELEY_DB2
DBC *cursorp; DBC *cursorp;
if ( ldbm_initialize() ) exit( 1 );
#endif #endif
ldbm_datum_init( key ); ldbm_datum_init( key );
@ -58,8 +60,8 @@ main( int argc, char **argv )
key = ldbm_nextkey( dbp, last ) ) key = ldbm_nextkey( dbp, last ) )
#endif #endif
{ {
if ( last.dptr != NULL ) ldbm_datum_free( dbp, last );
ldbm_datum_free( dbp, last );
data = ldbm_fetch( dbp, key ); data = ldbm_fetch( dbp, key );
if (( s = data.dptr ) != NULL ) { if (( s = data.dptr ) != NULL ) {
@ -73,18 +75,20 @@ main( int argc, char **argv )
puts( s ); puts( s );
} }
if ( data.dptr != NULL ) { ldbm_datum_free( dbp, data );
ldbm_datum_free( dbp, data );
}
} }
last = key; last = key;
} }
if ( last.dptr != NULL ) ldbm_datum_free( dbp, last );
ldbm_datum_free( dbp, last );
ldbm_close( dbp ); ldbm_close( dbp );
#ifdef HAVE_BERKELEY_DB2
(void) ldbm_shutdown();
#endif
exit( 0 ); exit( 0 );
return 0; /* NOT REACHED */ return 0; /* NOT REACHED */