diff options
| -rw-r--r-- | liblock/lockmail.c | 8 | ||||
| -rw-r--r-- | maildrop/deliver.C | 8 | ||||
| -rw-r--r-- | maildrop/main.C | 42 | ||||
| -rw-r--r-- | maildrop/setgroupid.c | 6 | ||||
| -rw-r--r-- | maildrop/setgroupid.h | 2 | ||||
| -rw-r--r-- | sqwebmail/sqwebmail.c | 35 |
6 files changed, 73 insertions, 28 deletions
diff --git a/liblock/lockmail.c b/liblock/lockmail.c index a2c81ee..fda0799 100644 --- a/liblock/lockmail.c +++ b/liblock/lockmail.c @@ -159,8 +159,12 @@ int main(int argc, char **argv) if (pid == 0) { - setgid(getgid()); - setuid(getuid()); + if (setgid(getgid()) < 0 || + setuid(getuid()) < 0) + { + perror("setuid/setgid"); + exit(1); + } (void)caught(); execvp(argvec[0], argvec); diff --git a/maildrop/deliver.C b/maildrop/deliver.C index 82d3108..2d06d33 100644 --- a/maildrop/deliver.C +++ b/maildrop/deliver.C @@ -280,8 +280,12 @@ int n; for (n=0; n<NSIG; n++) signal(n, SIG_DFL); - setgroupid(getgid()); // Just in case. - setuid(getuid()); + if (setgroupid(getgid()) < 0 || + setuid(getuid()) < 0) + { + perror("setuid/setgid"); + _exit(100); + } ExitTrap::onfork(); execle(shell, q, "-c", cmd, (const char *)0, env); if (write (2, "Unable to execute ", 18) < 0 || diff --git a/maildrop/main.C b/maildrop/main.C index d144263..2311aab 100644 --- a/maildrop/main.C +++ b/maildrop/main.C @@ -259,7 +259,11 @@ static int callback_authlib(struct authinfo *auth, << b << "\n"; } - setgroupid(auth->sysgroupid); + if (setgroupid(auth->sysgroupid) < 0) + { + perror("setgid"); + exit(1); + } uid_t u; if (auth->sysusername) @@ -291,9 +295,8 @@ static int callback_authlib(struct authinfo *auth, << b << "\n"; } - setuid(u); - - if ( getuid() != u) + if (setuid(u) < 0 || + getuid() != u) nochangeuidgid(); if (VerboseLevel() > 1) @@ -479,12 +482,17 @@ const char *numuidgid=0; my_pw=getpwnam(deliverymode); if (!my_pw) nouser(); + if ( #if RESET_GID - setgroupid(my_pw->pw_gid); + setgroupid(my_pw->pw_gid) < 0 #else - setgroupid(getegid()); + setgroupid(getegid()) < 0 #endif - setuid(my_pw->pw_uid); + || + setuid(my_pw->pw_uid) < 0) + { + nochangeuidgid(); + } if (getuid() != my_pw->pw_uid) nochangeuidgid(); // Security violation. @@ -560,8 +568,12 @@ const char *numuidgid=0; throw "Invalid -D option."; } } - setgroupid(gn); - setuid(un); + if (setgroupid(gn) < 0 || + setuid(un) < 0) + { + perror("setuid/setgid"); + exit(1); + } deliverymode=""; orig_uid=un; /* See below for another Courier hook */ } @@ -570,12 +582,20 @@ const char *numuidgid=0; #if RESET_GID - setgroupid(getgid()); + if (setgroupid(getgid()) < 0) + { + perror("setgid"); + exit(1); + } #endif uid_t my_u=getuid(); - setuid(my_u); // Drop any setuid privileges. + if (setuid(my_u) < 0) // Drop any setuid privileges. + { + perror("setuid"); + exit(1); + } if (!found) { diff --git a/maildrop/setgroupid.c b/maildrop/setgroupid.c index 33820b0..574ea2e 100644 --- a/maildrop/setgroupid.c +++ b/maildrop/setgroupid.c @@ -1,13 +1,13 @@ #include "setgroupid.h" -void setgroupid(gid_t grpid) +int setgroupid(gid_t grpid) { -gid_t g=grpid; + gid_t g=grpid; #if HAVE_SETGROUPS setgroups(1, &g); #endif - setgid(g); + return setgid(g); } diff --git a/maildrop/setgroupid.h b/maildrop/setgroupid.h index eae7d6b..1add963 100644 --- a/maildrop/setgroupid.h +++ b/maildrop/setgroupid.h @@ -17,6 +17,6 @@ extern "C" #endif - void setgroupid(gid_t grpid); +int setgroupid(gid_t grpid); #endif diff --git a/sqwebmail/sqwebmail.c b/sqwebmail/sqwebmail.c index 3604568..8c4cfe1 100644 --- a/sqwebmail/sqwebmail.c +++ b/sqwebmail/sqwebmail.c @@ -2190,7 +2190,7 @@ int main(int argc, char **argv) static int setuidgid(uid_t u, gid_t g, const char *dir, void *dummy) { - if (setgid(g) || setuid(u)) + if (setgid(g) < 0 || setuid(u) < 0) { fprintf(stderr, "CRIT: Cache - can't setuid/setgid to %u/%u\n", @@ -2275,8 +2275,12 @@ time_t timeouthard=get_timeouthard(); if (*pi_malloced == 0) { free(pi_malloced); - setgid(getgid()); - setuid(getuid()); + if (setgid(getgid()) < 0 || + setuid(getuid()) < 0) + { + perror("setuid/setgid"); + exit(1); + } output_form("printnocookie.html"); return; } @@ -2360,8 +2364,12 @@ time_t timeouthard=get_timeouthard(); || last_time + timeoutsoft < current_time) { - setgid(getgid()); - setuid(getuid()); /* Drop root prevs */ + if (setgid(getgid()) < 0 || + setuid(getuid()) < 0) /* Drop root prevs */ + { + perror("setuid/setgid"); + exit(1); + } if (chdir("/") < 0) { output_form("expired.html"); @@ -2599,14 +2607,23 @@ time_t timeouthard=get_timeouthard(); maildir_cache_cancel(); free(ubuf); - setgid(getgid()); - setuid(getuid()); + if (setgid(getgid()) < 0 || + setuid(getuid()) < 0) /* Drop root prevs */ + { + perror("setuid/setgid"); + exit(1); + } output_form("invalid.html"); /* Invalid login */ return; } - setgid(getgid()); - setuid(getuid()); + if (setgid(getgid()) < 0 || + setuid(getuid()) < 0) /* Drop root prevs */ + { + perror("setuid/setgid"); + exit(1); + } + if ( *(u=cgi("redirect"))) /* Redirection request to hide the referral tag */ { |
