]> git.sur5r.net Git - openldap/commitdiff
Check DB directory validity at config time
authorHoward Chu <hyc@openldap.org>
Mon, 15 Oct 2007 10:17:04 +0000 (10:17 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 15 Oct 2007 10:17:04 +0000 (10:17 +0000)
servers/slapd/back-bdb/config.c

index 3844629cb4bf734c70b38a190a55726586a55a87..c1a29e527efec7f05d840d083339f065d3597782 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <ac/ctype.h>
 #include <ac/string.h>
+#include <ac/errno.h>
 
 #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];