diff options
author | Eric Faurot <eric@faurot.net> | 2013-07-09 15:01:41 +0200 |
---|---|---|
committer | Eric Faurot <eric@faurot.net> | 2013-07-09 15:01:41 +0200 |
commit | 27ffba4f2df6b94a4e0f6972e217aacb5e0f486c (patch) | |
tree | d265963d59e3c7efa7f66531767752e7f02ab55a | |
parent | also apply the delay between transactions in the RSET case. (diff) | |
download | OpenSMTPD-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.c | 3 | ||||
-rw-r--r-- | smtpd/lka.c | 3 | ||||
-rw-r--r-- | smtpd/mda.c | 3 | ||||
-rw-r--r-- | smtpd/mfa.c | 3 | ||||
-rw-r--r-- | smtpd/mta.c | 4 | ||||
-rw-r--r-- | smtpd/queue.c | 9 | ||||
-rw-r--r-- | smtpd/queue_backend.c | 26 | ||||
-rw-r--r-- | smtpd/queue_fs.c | 7 | ||||
-rw-r--r-- | smtpd/queue_null.c | 2 | ||||
-rw-r--r-- | smtpd/queue_proc.c | 2 | ||||
-rw-r--r-- | smtpd/scheduler.c | 4 | ||||
-rw-r--r-- | smtpd/smtp.c | 3 | ||||
-rw-r--r-- | smtpd/smtpctl.c | 1 | ||||
-rw-r--r-- | smtpd/smtpd.c | 33 | ||||
-rw-r--r-- | smtpd/smtpd.h | 6 |
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 { |