diff options
Diffstat (limited to 'maildrop.c')
-rw-r--r-- | maildrop.c | 30 |
1 files changed, 7 insertions, 23 deletions
@@ -47,7 +47,7 @@ static size_t expand(char *, const char *, size_t, struct passwd *); static struct mdrop m; -void +pid_t maildrop_init(uint32_t session_id, int pair[2], struct passwd *pw, int type, const char *path) { @@ -60,21 +60,13 @@ maildrop_init(uint32_t session_id, int pair[2], struct passwd *pw, mode_t old_mask; int fd, flags, res = -1; - if (seteuid(pw->pw_uid) < 0) - fatal("cannot lower privileges"); + if ((pid = fork()) != 0) + return (pid); - pid = fork(); - if (seteuid(0) < 0) - fatal("cannot restore privileges"); - - if (pid < 0) - fatal("maildrop: fork"); - - if (pid > 0) - return; - - if (seteuid(pw->pw_uid) < 0) - fatal("cannot lower privileges"); + if (setgroups(1, &pw->pw_gid) || + setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) || + setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) + fatal("cannot drop privileges"); close(pair[0]); setproctitle("maildrop"); @@ -100,14 +92,6 @@ maildrop_init(uint32_t session_id, int pair[2], struct passwd *pw, } umask(old_mask); - if (seteuid(0) < 0) - fatal("cannot restore privileges"); - - if (setgroups(1, &pw->pw_gid) || - setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) || - setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) - fatal("cannot drop privileges"); - event_init(); signal_set(&ev_sigint, SIGINT, sig_handler, NULL); signal_set(&ev_sigterm, SIGTERM, sig_handler, NULL); |