]> git.sur5r.net Git - openldap/commitdiff
Fix cargv leak in recursive read_config()
authorHoward Chu <hyc@openldap.org>
Wed, 7 Aug 2002 08:22:43 +0000 (08:22 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 7 Aug 2002 08:22:43 +0000 (08:22 +0000)
servers/slapd/config.c
servers/slapd/main.c
servers/slapd/proto-slap.h
servers/slapd/tools/slapcommon.c

index 5362cbdb9efd245576f6511f89b5c45be9ee054b..0046551709c614c046b8e1d63b292dd47bc37855 100644 (file)
@@ -75,7 +75,7 @@ static char   *strtok_quote(char *line, char *sep);
 static int      load_ucdata(char *path);
 
 int
-read_config( const char *fname )
+read_config( const char *fname, int depth )
 {
        FILE    *fp;
        char    *line, *savefname, *saveline;
@@ -90,8 +90,10 @@ read_config( const char *fname )
 
        vals[1].bv_val = NULL;
 
-       cargv = ch_calloc( ARGS_STEP + 1, sizeof(*cargv) );
-       cargv_size = ARGS_STEP + 1;
+       if ( depth == 0 ) {
+               cargv = ch_calloc( ARGS_STEP + 1, sizeof(*cargv) );
+               cargv_size = ARGS_STEP + 1;
+       }
 
        if ( (fp = fopen( fname, "r" )) == NULL ) {
                ldap_syslog = 1;
@@ -2012,7 +2014,7 @@ read_config( const char *fname )
                        savefname = ch_strdup( cargv[1] );
                        savelineno = lineno;
 
-                       if ( read_config( savefname ) != 0 ) {
+                       if ( read_config( savefname, depth+1 ) != 0 ) {
                                return( 1 );
                        }
 
@@ -2257,6 +2259,8 @@ read_config( const char *fname )
        }
        fclose( fp );
 
+       if ( depth == 0 ) ch_free( cargv );
+
        if ( load_ucdata( NULL ) < 0 ) return 1;
        return( 0 );
 }
index de931e49088dd0318cf6b010e6556abb2f6b8520..8a40fe52a7ddf9fff083e68ddcb6f874490921b5 100644 (file)
@@ -405,7 +405,7 @@ int main( int argc, char **argv )
        (void) ldap_pvt_tls_set_option( NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &rc );
 #endif
 
-       if ( read_config( configfile ) != 0 ) {
+       if ( read_config( configfile, 0 ) != 0 ) {
                rc = 1;
                SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 19 );
 
index 583b09e5b1fbb6af05bbd40df8061fec4988b655..cb65f3fb925c46ddda876ade020684bb01084639 100644 (file)
@@ -280,7 +280,7 @@ LDAP_SLAPD_F (char *) get_supported_ctrl LDAP_P((int index));
 /*
  * config.c
  */
-LDAP_SLAPD_F (int) read_config LDAP_P(( const char *fname ));
+LDAP_SLAPD_F (int) read_config LDAP_P(( const char *fname, int depth ));
 LDAP_SLAPD_F (void) config_destroy LDAP_P ((void));
 
 /*
index abe5b7abeb754ee50f234627758e243640aa7887..27c6712724d3f3ec3bdeea300d39c063f7d8109b 100644 (file)
@@ -195,7 +195,7 @@ slap_tool_init(
                exit( EXIT_FAILURE );
        }
 
-       rc = read_config( conffile );
+       rc = read_config( conffile, 0 );
 
        if ( rc != 0 ) {
                fprintf( stderr, "%s: bad configuration file!\n", progname );