|
|
@ -2252,22 +2252,32 @@ bool DropPrivileges() /*{{{*/ |
|
|
|
return _error->Error("No user %s, can not drop rights", toUser.c_str()); |
|
|
|
|
|
|
|
// Do not change the order here, it might break things
|
|
|
|
// Get rid of all our supplementary groups first
|
|
|
|
if (setgroups(1, &pw->pw_gid)) |
|
|
|
return _error->Errno("setgroups", "Failed to setgroups"); |
|
|
|
|
|
|
|
// Now change the group ids to the new user
|
|
|
|
#ifdef HAVE_SETRESGID |
|
|
|
if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0) |
|
|
|
return _error->Errno("setresgid", "Failed to set new group ids"); |
|
|
|
#else |
|
|
|
if (setegid(pw->pw_gid) != 0) |
|
|
|
return _error->Errno("setegid", "Failed to setegid"); |
|
|
|
|
|
|
|
if (setgid(pw->pw_gid) != 0) |
|
|
|
return _error->Errno("setgid", "Failed to setgid"); |
|
|
|
#endif |
|
|
|
|
|
|
|
// Change the user ids to the new user
|
|
|
|
#ifdef HAVE_SETRESUID |
|
|
|
if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) != 0) |
|
|
|
return _error->Errno("setresuid", "Failed to set new user ids"); |
|
|
|
#else |
|
|
|
if (setuid(pw->pw_uid) != 0) |
|
|
|
return _error->Errno("setuid", "Failed to setuid"); |
|
|
|
|
|
|
|
// the seteuid() is probably uneeded (at least thats what the linux
|
|
|
|
// man-page says about setuid(2)) but we cargo culted it anyway
|
|
|
|
if (seteuid(pw->pw_uid) != 0) |
|
|
|
return _error->Errno("seteuid", "Failed to seteuid"); |
|
|
|
#endif |
|
|
|
|
|
|
|
// Verify that the user has only a single group, and the correct one
|
|
|
|
gid_t groups[1]; |
|
|
|