diff options
-rw-r--r-- | src/inspircd.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 9a64331b5..f1cccab19 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -730,48 +730,59 @@ InspIRCd::InspIRCd(int argc, char** argv) Logs->Log("STARTUP", DEFAULT, "Startup complete as '%s'[%s], %d max open sockets", Config->ServerName,Config->GetSID().c_str(), SE->GetMaxFds()); #ifndef WIN32 - if (*(this->Config->SetUser)) + if (*(this->Config->SetGroup)) { - // setuid - struct passwd *u; + int ret; + + // setgroups + ret = setgroups(0, NULL); + + if (ret == -1) + { + this->Logs->Log("SETGROUPS", DEFAULT, "setgroups() failed (wtf?): %s", strerror(errno)); + this->QuickExit(0); + } + + // setgid + struct group *g; errno = 0; - u = getpwnam(this->Config->SetUser); + g = getgrnam(this->Config->SetGroup); - if (!u) + if (!g) { - this->Logs->Log("SETGUID", DEFAULT, "getpwnam() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("SETGUID", DEFAULT, "getgrnam() failed (bad user?): %s", strerror(errno)); this->QuickExit(0); } - int ret = setuid(u->pw_uid); + ret = setgid(g->gr_gid); if (ret == -1) { - this->Logs->Log("SETGUID", DEFAULT, "setuid() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("SETGUID", DEFAULT, "setgid() failed (bad user?): %s", strerror(errno)); this->QuickExit(0); } } - if (*(this->Config->SetGroup)) + if (*(this->Config->SetUser)) { - // setgid - struct group *g; + // setuid + struct passwd *u; errno = 0; - g = getgrnam(this->Config->SetGroup); + u = getpwnam(this->Config->SetUser); - if (!g) + if (!u) { - this->Logs->Log("SETGUID", DEFAULT, "getgrnam() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("SETGUID", DEFAULT, "getpwnam() failed (bad user?): %s", strerror(errno)); this->QuickExit(0); } - int ret = setgid(g->gr_gid); + int ret = setuid(u->pw_uid); if (ret == -1) { - this->Logs->Log("SETGUID", DEFAULT, "setgid() failed (bad user?): %s", strerror(errno)); + this->Logs->Log("SETGUID", DEFAULT, "setuid() failed (bad user?): %s", strerror(errno)); this->QuickExit(0); } } |