Commit 15b84e14 authored by David Dykstra's avatar David Dykstra

Make sure the log file is always opened before root privileges (if any)

are given up.
parent 45a83540
...@@ -30,12 +30,8 @@ static int log_error_fd = -1; ...@@ -30,12 +30,8 @@ static int log_error_fd = -1;
static void logit(int priority, char *buf) static void logit(int priority, char *buf)
{ {
if (logfname) { if (logfname) {
if (!logfile) { if (!logfile)
extern int orig_umask; log_open();
int old_umask = umask(022 | orig_umask);
logfile = fopen(logfname, "a");
umask(old_umask);
}
fprintf(logfile,"%s [%d] %s", fprintf(logfile,"%s [%d] %s",
timestring(time(NULL)), (int)getpid(), buf); timestring(time(NULL)), (int)getpid(), buf);
fflush(logfile); fflush(logfile);
...@@ -62,8 +58,10 @@ void log_init(void) ...@@ -62,8 +58,10 @@ void log_init(void)
/* optionally use a log file instead of syslog */ /* optionally use a log file instead of syslog */
logfname = lp_log_file(); logfname = lp_log_file();
if (logfname) { if (logfname) {
if (*logfname) if (*logfname) {
log_open();
return; return;
}
logfname = NULL; logfname = NULL;
} }
...@@ -82,9 +80,17 @@ void log_init(void) ...@@ -82,9 +80,17 @@ void log_init(void)
#endif #endif
} }
/* for long runs when using a log file, close it before potential long waits void log_open()
so it can be trimmed by another process instead of growing forever */ {
void log_release() if (logfname && !logfile) {
extern int orig_umask;
int old_umask = umask(022 | orig_umask);
logfile = fopen(logfname, "a");
umask(old_umask);
}
}
void log_close()
{ {
if (logfile) { if (logfile) {
fclose(logfile); fclose(logfile);
......
...@@ -247,7 +247,10 @@ void start_accept_loop(int port, int (*fn)(int )) ...@@ -247,7 +247,10 @@ void start_accept_loop(int port, int (*fn)(int ))
struct sockaddr addr; struct sockaddr addr;
int in_addrlen = sizeof(addr); int in_addrlen = sizeof(addr);
log_release(); /* close log file before the potentially very long select so
file can be trimmed by another process instead of growing
forever */
log_close();
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(s, &fds); FD_SET(s, &fds);
...@@ -274,6 +277,10 @@ void start_accept_loop(int port, int (*fn)(int )) ...@@ -274,6 +277,10 @@ void start_accept_loop(int port, int (*fn)(int ))
if (fork()==0) { if (fork()==0) {
close(s); close(s);
/* open log file in child before possibly giving
up privileges */
log_open();
_exit(fn(fd)); _exit(fn(fd));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment