[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Release 1.2 ldbmcat problem with Berkeley DB (ITS#85,#81)



Hi,

I have just fixed the ldbmcat problem. The problem was twofold, in that
db_appinit was not invoked, although needed by ldbm_open, and in that
key data were free'ed twice, causing a segmentation fault.

Thanks for reporting the bugs.


Regards,

Kurt
ksp@openldap.org


On Thu, 25 Feb 1999 svakil@internetdevices.com wrote:

> Date: Thu, 25 Feb 1999 18:04:53 GMT
> From: svakil@internetdevices.com
> To: openldap-its@OpenLDAP.org
> Subject: Release 1.2 ldbmcat problem with Berkeley DB  (ITS#85)
> 
> Full_Name: Sumit A. Vakil
> Version: 1.2
> OS: FreeBSD
> URL: ftp://ftp.openldap.org/incoming/
> Submission from: (NULL) (205.138.236.250)
> 
> 
> I have OpenLDAP version 1.2 compiled on a FreeBSD 2.2.x system.  I'm using the
> Berkeley DB 2.3.16 database.  ldbmcat does not work.  Running ldbmcat does not
> produce any ldif output.  It also complains about chunks of memory being freed
> again.
> 
> The problem is easy to reproduce.  Simply run ldbmcat (with or without the -n
> option) on an existing db.
> 
> The details of the problem and a suggested fix are as follows:
> 
> The problem is that ldbm_firstkey() sets the key flags to DB_DBT_MALLOC whereas
> the DB functions called by ldbm_fetch() expect the key flags to be zero.  I
> fixed the problem by setting the key flags to zero before calling ldbm_fetch()
> and then setting them back to DB_DBT_MALLOC.  Note that the key flags should be
> set back to DB_DBT_MALLOC before calling ldbm_nextkey().
> 
> Another problem I noticed was that some chunks of memory were being free twice. 
> The problem there is that ldbmcat tries to free key.data.  This memory is
> already freed by ldbm_nextkey().  Removing the 
>                if ( last.dptr != NULL )
>                         ldbm_datum_free( dbp, last );
> lines fixes the problem.
> 
> Updated main() in ldbmcat.c:
> 
> int
> main( int argc, char **argv )
> {
>         Datum                key, last, data;
>         LDBM                dbp;
>         int                rc, type;
>         long                id;
>         char                *file, *s;
>         int                printid = 1;
> 
> #ifdef HAVE_BERKELEY_DB2
>         DBC        *cursorp;
> #endif
> 
>         ldbm_datum_init( key );
>         ldbm_datum_init( last );
>         ldbm_datum_init( data );
> 
>         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;
> 
> #ifdef HAVE_BERKELEY_DB2
>         for ( key = ldbm_firstkey( dbp, &cursorp ); key.dptr != NULL;
>             key = ldbm_nextkey( dbp, last, cursorp ) )
> #else
>         for ( key = ldbm_firstkey( dbp ); key.dptr != NULL;
>             key = ldbm_nextkey( dbp, last ) )
> #endif
>         {
> /* Begin Internet Devices mods. */
> #ifdef HAVE_BERKELEY_DB2
>                 key.flags = 0;
>                 data = ldbm_fetch( dbp, key );
>                 key.flags = DB_DBT_MALLOC;
> #else
>                 if ( last.dptr != NULL )
>                         ldbm_datum_free( dbp, last );
>                 data = ldbm_fetch( dbp, key );
> #endif HAVE_BERKELEY_DB2
> /* End Internet Devices mods. */
> 
>                 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;
>         }
> 
> /* Begin Internet Devices mods. */
> #ifndef HAVE_BERKELEY_DB2
>         if ( last.dptr != NULL )
>                 ldbm_datum_free( dbp, last );
> #endif HAVE_BERKELEY_DB2
> /* End Internet Devices mods. */
> 
>         ldbm_close( dbp );
> 
>         exit( 0 );
> }
> 
> 


----------==========#########>>>>>ZDV<<<<<#########==========----------

X.500:                                              Tel.:
   Kurt Spanier, Zentrum fuer Datenverarbeitung,      +49 7071 29-70334
   Universitaet Tuebingen, DE
SMTP-Mail:                                          FAX.:
   kurt.spanier@zdv.uni-tuebingen.de                   +49 7071 29-5912
Snail-Mail:
   Dr. Kurt Spanier, Zentrum fuer Datenverarbeitung,
   Universitaet Tuebingen, Waechterstrasse 76, D-72074 Tuebingen
PGP-Public-Key:
   finger "Kurt Spanier"@x500.uni-tuebingen.de

----------==========##########>>>>>@<<<<<##########==========----------