aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Faurot <eric@faurot.net>2013-07-09 15:01:41 +0200
committerEric Faurot <eric@faurot.net>2013-07-09 15:01:41 +0200
commit27ffba4f2df6b94a4e0f6972e217aacb5e0f486c (patch)
treed265963d59e3c7efa7f66531767752e7f02ab55a
parentalso apply the delay between transactions in the RSET case. (diff)
downloadOpenSMTPD-27ffba4f2df6b94a4e0f6972e217aacb5e0f486c.tar.xz
OpenSMTPD-27ffba4f2df6b94a4e0f6972e217aacb5e0f486c.zip
Get rid of env->sc_pw and env->sc_pwqueue. Each process explicitlyopensmtpd-201307091511
fetch the user it needs. Move early queue initialization in queue_init(). Queue Backends now take the queue passwd as parameter in their init functions. Fix a segfault in smtpctl in offline mode.
-rw-r--r--smtpd/control.c3
-rw-r--r--smtpd/lka.c3
-rw-r--r--smtpd/mda.c3
-rw-r--r--smtpd/mfa.c3
-rw-r--r--smtpd/mta.c4
-rw-r--r--smtpd/queue.c9
-rw-r--r--smtpd/queue_backend.c26
-rw-r--r--smtpd/queue_fs.c7
-rw-r--r--smtpd/queue_null.c2
-rw-r--r--smtpd/queue_proc.c2
-rw-r--r--smtpd/scheduler.c4
-rw-r--r--smtpd/smtp.c3
-rw-r--r--smtpd/smtpctl.c1
-rw-r--r--smtpd/smtpd.c33
-rw-r--r--smtpd/smtpd.h6
15 files changed, 56 insertions, 53 deletions
diff --git a/smtpd/control.c b/smtpd/control.c
index 1a81892a..230d997c 100644
--- a/smtpd/control.c
+++ b/smtpd/control.c
@@ -204,7 +204,8 @@ control(void)
purge_config(PURGE_EVERYTHING);
- pw = env->sc_pw;
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
fatal("control: socket");
diff --git a/smtpd/lka.c b/smtpd/lka.c
index 49340bd3..f0c4e02a 100644
--- a/smtpd/lka.c
+++ b/smtpd/lka.c
@@ -589,9 +589,8 @@ lka(void)
purge_config(PURGE_EVERYTHING);
- if ((env->sc_pw = getpwnam(SMTPD_USER)) == NULL)
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
fatalx("unknown user " SMTPD_USER);
- pw = env->sc_pw;
config_process(PROC_LKA);
diff --git a/smtpd/mda.c b/smtpd/mda.c
index 149570e4..f444a6ed 100644
--- a/smtpd/mda.c
+++ b/smtpd/mda.c
@@ -507,7 +507,8 @@ mda(void)
purge_config(PURGE_EVERYTHING);
- pw = env->sc_pw;
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
if (chroot(PATH_CHROOT) == -1)
fatal("mda: chroot");
diff --git a/smtpd/mfa.c b/smtpd/mfa.c
index 6dfbb292..f4d823f6 100644
--- a/smtpd/mfa.c
+++ b/smtpd/mfa.c
@@ -224,12 +224,11 @@ mfa(void)
purge_config(PURGE_EVERYTHING);
- if ((env->sc_pw = getpwnam(SMTPD_USER)) == NULL)
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
fatalx("unknown user " SMTPD_USER);
config_process(PROC_MFA);
- pw = env->sc_pw;
if (chroot(PATH_CHROOT) == -1)
fatal("scheduler: chroot");
if (chdir("/") == -1)
diff --git a/smtpd/mta.c b/smtpd/mta.c
index 6c912373..be2634a3 100644
--- a/smtpd/mta.c
+++ b/smtpd/mta.c
@@ -450,7 +450,9 @@ mta(void)
purge_config(PURGE_EVERYTHING);
- pw = env->sc_pw;
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
+
if (chroot(PATH_CHROOT) == -1)
fatal("mta: chroot");
if (chdir("/") == -1)
diff --git a/smtpd/queue.c b/smtpd/queue.c
index dc0f4428..3ee3f18b 100644
--- a/smtpd/queue.c
+++ b/smtpd/queue.c
@@ -534,15 +534,14 @@ queue(void)
}
purge_config(PURGE_EVERYTHING);
- if (env->sc_pwqueue) {
- free(env->sc_pw);
- env->sc_pw = env->sc_pwqueue;
- }
+
+ if ((pw = getpwnam(SMTPD_QUEUE_USER)) == NULL)
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
env->sc_queue_flags |= QUEUE_EVPCACHE;
env->sc_queue_evpcache_size = 1024;
- pw = env->sc_pw;
if (chroot(PATH_SPOOL) == -1)
fatal("queue: chroot");
if (chdir("/") == -1)
diff --git a/smtpd/queue_backend.c b/smtpd/queue_backend.c
index 37471b29..dffe472f 100644
--- a/smtpd/queue_backend.c
+++ b/smtpd/queue_backend.c
@@ -23,6 +23,7 @@
#include <sys/stat.h>
#include <ctype.h>
+#include <err.h>
#include <errno.h>
#include <event.h>
#include <fcntl.h>
@@ -110,7 +111,14 @@ queue_message_path(uint32_t msgid, char *buf, size_t len)
int
queue_init(const char *name, int server)
{
- int r;
+ struct passwd *pwq;
+ int r;
+
+ pwq = getpwnam(SMTPD_QUEUE_USER);
+ if (pwq == NULL)
+ pwq = getpwnam(SMTPD_USER);
+ if (pwq == NULL)
+ errx(1, "unknown user %s", SMTPD_USER);
tree_init(&evpcache_tree);
TAILQ_INIT(&evpcache_list);
@@ -129,7 +137,21 @@ queue_init(const char *name, int server)
return (0);
}
- r = backend->init(server);
+ if (server) {
+ if (ckdir(PATH_SPOOL, 0711, 0, 0, 1) == 0)
+ errx(1, "error in spool directory setup");
+ if (ckdir(PATH_SPOOL PATH_OFFLINE, 01777, 0, 0, 1) == 0)
+ errx(1, "error in offline directory setup");
+ if (ckdir(PATH_SPOOL PATH_PURGE, 0700, pwq->pw_uid, 0, 1) == 0)
+ errx(1, "error in purge directory setup");
+
+ mvpurge(PATH_SPOOL PATH_TEMPORARY, PATH_SPOOL PATH_PURGE);
+
+ if (ckdir(PATH_SPOOL PATH_TEMPORARY, 0700, pwq->pw_uid, 0, 1) == 0)
+ errx(1, "error in purge directory setup");
+ }
+
+ r = backend->init(pwq, server);
log_trace(TRACE_QUEUE, "queue-backend: queue_init(%i) -> %i", server, r);
diff --git a/smtpd/queue_fs.c b/smtpd/queue_fs.c
index 42b4e177..e734275d 100644
--- a/smtpd/queue_fs.c
+++ b/smtpd/queue_fs.c
@@ -607,7 +607,7 @@ fsqueue_qwalk(void *hdl, uint64_t *evpid)
}
static int
-queue_fs_init(int server)
+queue_fs_init(struct passwd *pw, int server)
{
unsigned int n;
char *paths[] = { PATH_QUEUE, PATH_CORRUPT, PATH_INCOMING };
@@ -615,7 +615,7 @@ queue_fs_init(int server)
int ret;
struct timeval tv;
- /* remove incoming if it exists */
+ /* remove incoming/ if it exists */
if (server)
mvpurge(PATH_SPOOL PATH_INCOMING, PATH_SPOOL PATH_PURGE);
@@ -626,8 +626,7 @@ queue_fs_init(int server)
strlcpy(path, PATH_SPOOL, sizeof(path));
if (strlcat(path, paths[n], sizeof(path)) >= sizeof(path))
errx(1, "path too long %s%s", PATH_SPOOL, paths[n]);
-
- if (ckdir(path, 0700, env->sc_pwqueue->pw_uid, 0, server) == 0)
+ if (ckdir(path, 0700, pw->pw_uid, 0, server) == 0)
ret = 0;
}
diff --git a/smtpd/queue_null.c b/smtpd/queue_null.c
index 4be2701b..e51cabb4 100644
--- a/smtpd/queue_null.c
+++ b/smtpd/queue_null.c
@@ -104,7 +104,7 @@ queue_null_envelope_walk(uint64_t *evpid, char *buf, size_t len)
}
static int
-queue_null_init(int server)
+queue_null_init(struct passwd *pw, int server)
{
queue_api_on_message_create(queue_null_message_create);
queue_api_on_message_commit(queue_null_message_commit);
diff --git a/smtpd/queue_proc.c b/smtpd/queue_proc.c
index 663d79a6..632d8052 100644
--- a/smtpd/queue_proc.c
+++ b/smtpd/queue_proc.c
@@ -304,7 +304,7 @@ queue_proc_envelope_walk(uint64_t *evpid, char *buf, size_t len)
}
static int
-queue_proc_init(int server)
+queue_proc_init(struct passwd *pw, int server)
{
int sp[2];
uint32_t version;
diff --git a/smtpd/scheduler.c b/smtpd/scheduler.c
index b094d95b..730164b7 100644
--- a/smtpd/scheduler.c
+++ b/smtpd/scheduler.c
@@ -369,13 +369,15 @@ scheduler(void)
purge_config(PURGE_EVERYTHING);
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
+
config_process(PROC_SCHEDULER);
fdlimit(1.0);
backend->init();
- pw = env->sc_pw;
if (chroot(PATH_CHROOT) == -1)
fatal("scheduler: chroot");
if (chdir("/") == -1)
diff --git a/smtpd/smtp.c b/smtpd/smtp.c
index 490be359..e238b4ff 100644
--- a/smtpd/smtp.c
+++ b/smtpd/smtp.c
@@ -247,7 +247,8 @@ smtp(void)
purge_config(PURGE_EVERYTHING);
- pw = env->sc_pw;
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
if (chroot(PATH_CHROOT) == -1)
fatal("smtp: chroot");
diff --git a/smtpd/smtpctl.c b/smtpd/smtpctl.c
index 8bc463d3..4aee3ba1 100644
--- a/smtpd/smtpctl.c
+++ b/smtpd/smtpctl.c
@@ -606,6 +606,7 @@ do_show_queue(int argc, struct parameter *argv)
if (!srv_connect()) {
log_init(1);
+ queue_init("fs", 0);
if (chroot(PATH_SPOOL) == -1 || chdir(".") == -1)
err(1, "%s", PATH_SPOOL);
while ((r = queue_envelope_walk(&evp)) != -1)
diff --git a/smtpd/smtpd.c b/smtpd/smtpd.c
index 9de53a8c..7874aded 100644
--- a/smtpd/smtpd.c
+++ b/smtpd/smtpd.c
@@ -589,7 +589,6 @@ main(int argc, char *argv[])
struct event ev_sigchld;
struct event ev_sighup;
struct timeval tv;
- struct passwd *pwq;
env = &smtpd;
@@ -716,31 +715,6 @@ main(int argc, char *argv[])
if (geteuid())
errx(1, "need root privileges");
- if ((env->sc_pw = getpwnam(SMTPD_USER)) == NULL)
- errx(1, "unknown user %s", SMTPD_USER);
- if ((env->sc_pw = pw_dup(env->sc_pw)) == NULL)
- err(1, NULL);
-
- env->sc_pwqueue = getpwnam(SMTPD_QUEUE_USER);
- if (env->sc_pwqueue)
- pwq = env->sc_pwqueue = pw_dup(env->sc_pwqueue);
- else
- pwq = env->sc_pwqueue = pw_dup(env->sc_pw);
- if (env->sc_pwqueue == NULL)
- err(1, NULL);
-
- if (ckdir(PATH_SPOOL, 0711, 0, 0, 1) == 0)
- errx(1, "error in spool directory setup");
- if (ckdir(PATH_SPOOL PATH_OFFLINE, 01777, 0, 0, 1) == 0)
- errx(1, "error in offline directory setup");
- if (ckdir(PATH_SPOOL PATH_PURGE, 0700, pwq->pw_uid, 0, 1) == 0)
- errx(1, "error in purge directory setup");
-
- mvpurge(PATH_SPOOL PATH_TEMPORARY, PATH_SPOOL PATH_PURGE);
-
- if (ckdir(PATH_SPOOL PATH_TEMPORARY, 0700, pwq->pw_uid, 0, 1) == 0)
- errx(1, "error in purge directory setup");
-
if (!queue_init(backend_queue, 1))
errx(1, "could not initialize queue backend");
@@ -926,6 +900,7 @@ child_add(pid_t pid, int type, const char *title)
static void
purge_task(int fd, short ev, void *arg)
{
+ struct passwd *pw;
DIR *d;
int n;
uid_t uid;
@@ -947,12 +922,14 @@ purge_task(int fd, short ev, void *arg)
log_warn("warn: purge_task: fork");
break;
case 0:
+ if ((pw = getpwnam(SMTPD_USER)) == NULL)
+ fatalx("unknown user " SMTPD_USER);
if (chroot(PATH_SPOOL PATH_PURGE) == -1)
fatal("smtpd: chroot");
if (chdir("/") == -1)
fatal("smtpd: chdir");
- uid = env->sc_pw->pw_uid;
- gid = env->sc_pw->pw_gid;
+ uid = pw->pw_uid;
+ gid = pw->pw_gid;
if (setgroups(1, &gid) ||
setresgid(gid, gid, gid) ||
setresuid(uid, uid, uid))
diff --git a/smtpd/smtpd.h b/smtpd/smtpd.h
index 99e741b0..4052b3a9 100644
--- a/smtpd/smtpd.h
+++ b/smtpd/smtpd.h
@@ -526,8 +526,6 @@ struct smtpd {
int sc_qexpire;
#define MAX_BOUNCE_WARN 4
time_t sc_bounce_warn[MAX_BOUNCE_WARN];
- struct passwd *sc_pw;
- struct passwd *sc_pwqueue;
char sc_hostname[SMTPD_MAXHOSTNAMELEN];
struct stat_backend *sc_stat;
struct compress_backend *sc_comp;
@@ -765,8 +763,10 @@ struct mta_task {
char *sender;
};
+struct passwd;
+
struct queue_backend {
- int (*init)(int);
+ int (*init)(struct passwd *, int);
};
struct compress_backend {