[dovecot-cvs] dovecot/src/master settings.c,1.33,1.34

cras at procontrol.fi cras at procontrol.fi
Sat Dec 21 14:14:01 EET 2002


Update of /home/cvs/dovecot/src/master
In directory danu:/tmp/cvs-serv29177/src/master

Modified Files:
	settings.c 
Log Message:
If used base/login directories exist already, make sure they're with correct
permissions. Always delete contents in login directory at startup.

Added safe_mkdir(). changed unlink_directory() behaviour, and fixed a race
condition which could have made it follow symlinks to other directories and
delete them. Didn't really harm us so far, we never used it for deleting
unsafe directories.



Index: settings.c
===================================================================
RCS file: /home/cvs/dovecot/src/master/settings.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- settings.c	20 Dec 2002 01:47:11 -0000	1.33
+++ settings.c	21 Dec 2002 12:13:59 -0000	1.34
@@ -2,13 +2,14 @@
 
 #include "lib.h"
 #include "istream.h"
+#include "safe-mkdir.h"
+#include "unlink-directory.h"
 #include "settings.h"
 
 #include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <pwd.h>
-#include <sys/stat.h>
 
 typedef enum {
 	SET_STR,
@@ -231,12 +232,19 @@
 #endif
 
 	/* since they're under /var/run by default, they may have been
-	   deleted */
-	(void)mkdir(PKG_RUNDIR, 0700);
-	if (mkdir(set_login_dir, 0700) == 0)
-		(void)chown(set_login_dir, set_login_uid, set_login_gid);
-	if (access(set_login_dir, X_OK) < 0)
-		i_fatal("Can't access login directory %s: %m", set_login_dir);
+	   deleted. */
+	if (safe_mkdir(PKG_RUNDIR, 0700, 0, 0) == 0) {
+		i_warning("Corrected permissions for base directory %s",
+			  PKG_RUNDIR);
+	}
+
+	/* wipe out contents of login directory, if it exists */
+	if (unlink_directory(set_login_dir, FALSE) < 0)
+		i_fatal("unlink_directory() failed for %s: %m", set_login_dir);
+
+	if (safe_mkdir(set_login_dir, 0700, set_login_uid, set_login_gid) == 0)
+		i_warning("Corrected permissions for login directory %s",
+			  set_login_dir);
 
 	if (set_max_imap_processes < 1)
 		i_fatal("max_imap_processes must be at least 1");




More information about the dovecot-cvs mailing list