]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapcommon.c
ITS#6111 connection_state_closing() -> connection_valid()
[openldap] / servers / slapd / slapcommon.c
index fad2bb9a960e7be359a1de93af9108e0c6e93bc5..8d4527c9fc2a6bce2dba95f7571042ddf6cef363 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * Portions Copyright 1998-2003 Kurt D. Zeilenga.
  * Portions Copyright 2003 IBM Corporation.
  * All rights reserved.
@@ -80,7 +80,7 @@ usage( int tool, const char *progname )
 
        case SLAPCAT:
                options = " [-c]\n\t[-g] [-n databasenumber | -b suffix]"
-                       " [-l ldiffile] [-a filter]\n";
+                       " [-l ldiffile] [-a filter] [-s subtree]\n";
                break;
 
        case SLAPDN:
@@ -218,7 +218,7 @@ slap_tool_init(
        char *subtree = NULL;
        char *ldiffile  = NULL;
        char **debug_unknowns = NULL;
-       int rc, i, dbnum;
+       int rc, i;
        int mode = SLAP_TOOL_MODE;
        int truncatemode = 0;
        int use_glue = 1;
@@ -237,6 +237,7 @@ slap_tool_init(
                leakfile = stderr;
        }
        free( leakfilename );
+       leakfilename = NULL;
 #endif
 
        switch( tool ) {
@@ -353,7 +354,7 @@ slap_tool_init(
                        break;
 
                case 'n':       /* which config file db to index */
-                       if ( lutil_atoi( &dbnum, optarg ) ) {
+                       if ( lutil_atoi( &dbnum, optarg ) || dbnum < 0 ) {
                                usage( tool, progname );
                        }
                        break;
@@ -447,6 +448,7 @@ slap_tool_init(
 #endif
 #ifdef HAVE_EBCDIC
                free( logName );
+               logName = NULL;
 #endif
        }
 #endif /* LDAP_DEBUG && LDAP_SYSLOG */
@@ -564,7 +566,7 @@ slap_tool_init(
        }
 
        if ( use_glue ) {
-               rc = glue_sub_attach();
+               rc = glue_sub_attach( 0 );
 
                if ( rc != 0 ) {
                        fprintf( stderr,
@@ -598,6 +600,9 @@ slap_tool_init(
                        fprintf( stderr, "Invalid filter '%s'\n", filterstr );
                        exit( EXIT_FAILURE );
                }
+
+               ch_free( filterstr );
+               filterstr = NULL;
        }
 
        if( subtree ) {
@@ -613,6 +618,7 @@ slap_tool_init(
                        base = val;
                } else {
                        free( subtree );
+                       subtree = NULL;
                }
        }
 
@@ -628,6 +634,7 @@ slap_tool_init(
 
                be = select_backend( &nbase, 0 );
                ber_memfree( nbase.bv_val );
+               BER_BVZERO( &nbase );
 
                switch ( tool ) {
                case SLAPACL:
@@ -649,6 +656,9 @@ slap_tool_init(
                        nosubordinates = 1;
                }
 
+               ch_free( base.bv_val );
+               BER_BVZERO( &base );
+
        } else if ( dbnum == -1 ) {
                /* no suffix and no dbnum specified, just default to
                 * the first available database
@@ -689,12 +699,12 @@ slap_tool_init(
                                progname, dbnum, 0 );
                }
 
-       } else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
+       } else if ( dbnum >= nbackends ) {
                fprintf( stderr,
                        "Database number selected via -n is out of range\n"
                        "Must be in the range 0 to %d"
-                       " (number of configured databases)\n",
-                       nbackends-1 );
+                       " (the number of configured databases)\n",
+                       nbackends - 1 );
                exit( EXIT_FAILURE );
 
        } else {
@@ -705,6 +715,15 @@ slap_tool_init(
        }
 
 startup:;
+       if ( be ) {
+               BackendDB *bdtmp;
+
+               dbnum = 0;
+               LDAP_STAILQ_FOREACH( bdtmp, &backendDB, be_next ) {
+                       if ( bdtmp == be ) break;
+                       dbnum++;
+               }
+       }
 
 #ifdef CSRIMALLOC
        mal_leaktrace(1);
@@ -712,10 +731,12 @@ startup:;
 
        if ( conffile != NULL ) {
                ch_free( conffile );
+               conffile = NULL;
        }
 
        if ( ldiffile != NULL ) {
                ch_free( ldiffile );
+               ldiffile = NULL;
        }
 
        /* slapdn doesn't specify a backend to startup */
@@ -770,6 +791,7 @@ int slap_tool_destroy( void )
 
        if ( !BER_BVISNULL( &authcDN ) ) {
                ch_free( authcDN.bv_val );
+               BER_BVZERO( &authcDN );
        }
 
        if ( ldiffp && ldiffp != &dummy ) {