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.
void cdb_check_handles(void);
void cdb_trunc(int cdb);
void *checkpoint_thread(void *arg);
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
/*
* Database records beginning with this magic number are assumed to
int i;
char dbfilename[SIZ];
u_int32_t flags = 0;
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);
lprintf(CTDL_DEBUG, "cdb_*: open_databases() starting\n");
lprintf(CTDL_DEBUG, "Compiled db: %s\n", DB_VERSION_STRING);
+}
+
+
+/* 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);
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))
+ );
* corresponding group ids
*/
if (drop_root_perms) {
* 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
#ifdef SOLARIS_GETPWUID
pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
#else