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

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



Though I believe Ksp is working on a long term solution,
I am going to apply this patch to rel eng 1.2.  It appears
to resolve the problem the reported problems.

Kurt

At 06:04 PM 2/25/99 GMT, svakil@internetdevices.com wrote:
>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 );
>}
>
>
>