summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--liblock/lockmail.c8
-rw-r--r--maildrop/deliver.C8
-rw-r--r--maildrop/main.C42
-rw-r--r--maildrop/setgroupid.c6
-rw-r--r--maildrop/setgroupid.h2
-rw-r--r--sqwebmail/sqwebmail.c35
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 */
{