From: Howard Chu Date: Mon, 15 Oct 2007 10:17:04 +0000 (+0000) Subject: Check DB directory validity at config time X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~511 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=a8ba9e213183563c2289b90c62447a4b6e9b6ed5;p=openldap Check DB directory validity at config time --- diff --git a/servers/slapd/back-bdb/config.c b/servers/slapd/back-bdb/config.c index 3844629cb4..c1a29e527e 100644 --- a/servers/slapd/back-bdb/config.c +++ b/servers/slapd/back-bdb/config.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "back-bdb.h" @@ -331,8 +332,11 @@ bdb_cf_cleanup( ConfigArgs *c ) /* If this fails, we need to restart */ if ( rc ) { slapd_shutdown = 2; + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "failed to reopen database, rc=%d", rc ); Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(bdb_cf_cleanup) - ": failed to reopen database, rc=%d", rc, 0, 0 ); + ": %s\n", c->cr_msg, 0, 0 ); + rc = LDAP_OTHER; } } return rc; @@ -614,7 +618,25 @@ bdb_cf_gen( ConfigArgs *c ) case BDB_DIRECTORY: { FILE *f; - char *ptr; + char *ptr, *testpath; + int len; + + len = strlen( c->value_string ); + testpath = ch_malloc( len + STRLENOF(LDAP_DIRSEP) + STRLENOF("DUMMY") + 1 ); + ptr = lutil_strcopy( testpath, c->value_string ); + *ptr++ = LDAP_DIRSEP[0]; + strcpy( ptr, "DUMMY" ); + f = fopen( testpath, "w" ); + if ( f ) { + fclose( f ); + unlink( testpath ); + } + ch_free( testpath ); + if ( !f ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), "invalid path: %s", strerror( errno )); + Debug( LDAP_DEBUG_ANY, "%s: %s\n", c->log, c->cr_msg, 0 ); + return -1; + } if ( bdb->bi_dbenv_home ) ch_free( bdb->bi_dbenv_home ); @@ -623,7 +645,7 @@ bdb_cf_gen( ConfigArgs *c ) /* See if a DB_CONFIG file already exists here */ if ( bdb->bi_db_config_path ) ch_free( bdb->bi_db_config_path ); - bdb->bi_db_config_path = ch_malloc( strlen( bdb->bi_dbenv_home ) + + bdb->bi_db_config_path = ch_malloc( len + STRLENOF(LDAP_DIRSEP) + STRLENOF("DB_CONFIG") + 1 ); ptr = lutil_strcopy( bdb->bi_db_config_path, bdb->bi_dbenv_home ); *ptr++ = LDAP_DIRSEP[0];