From 5faa31044eeb42801e4ac7db566b686f0d7a5477 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Tue, 5 Jun 2007 21:40:42 +0000 Subject: [PATCH] New versions of Berkeley DB (I tested with 4.5.20) seem to have a new algorithm that always creates a new log file on startup. This broke Citadel's drop_root_perms and caused a database crash. Refactored the order of startup functions, separating the code which performs chown and chmod on files in ctdl_data_dir into its own function and calling that immediately prior to dropping root permissions. --- citadel/database.h | 1 + citadel/database_sleepycat.c | 24 ++++++++++++++++-------- citadel/server_main.c | 2 ++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/citadel/database.h b/citadel/database.h index 7fd42bcb8..b913faa87 100644 --- a/citadel/database.h +++ b/citadel/database.h @@ -16,6 +16,7 @@ void cdb_free_tsd(void); void cdb_check_handles(void); void cdb_trunc(int cdb); void *checkpoint_thread(void *arg); +void cdb_chmod_data(void); /* * Database records beginning with this magic number are assumed to diff --git a/citadel/database_sleepycat.c b/citadel/database_sleepycat.c index cfa60460a..918b6d415 100644 --- a/citadel/database_sleepycat.c +++ b/citadel/database_sleepycat.c @@ -343,9 +343,6 @@ void open_databases(void) int i; char dbfilename[SIZ]; u_int32_t flags = 0; - DIR *dp; - struct dirent *d; - char filename[PATH_MAX]; lprintf(CTDL_DEBUG, "cdb_*: open_databases() starting\n"); lprintf(CTDL_DEBUG, "Compiled db: %s\n", DB_VERSION_STRING); @@ -452,18 +449,29 @@ void open_databases(void) } cdb_allocate_tsd(); +} + + +/* Make sure we own all the files, because in a few milliseconds + * we're going to drop root privs. + */ +void cdb_chmod_data(void) { + DIR *dp; + struct dirent *d; + char filename[PATH_MAX]; - /* Now make sure we own all the files, because in a few milliseconds - * we're going to drop root privs. - */ dp = opendir(ctdl_data_dir); if (dp != NULL) { while (d = readdir(dp), d != NULL) { if (d->d_name[0] != '.') { snprintf(filename, sizeof filename, "%s/%s", ctdl_data_dir, d->d_name); - chmod(filename, 0600); - chown(filename, CTDLUID, (-1)); + lprintf(9, "chmod(%s, 0600) returned %d\n", + filename, chmod(filename, 0600) + ); + lprintf(9, "chown(%s, CTDLUID, -1) returned %d\n", + filename, chown(filename, CTDLUID, (-1)) + ); } } closedir(dp); diff --git a/citadel/server_main.c b/citadel/server_main.c index d831ec0f5..7f9551ebc 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -241,6 +241,8 @@ int main(int argc, char **argv) * corresponding group ids */ if (drop_root_perms) { + cdb_chmod_data(); /* make sure we own our data files */ + #ifdef SOLARIS_GETPWUID pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf)); #else -- 2.30.2