summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--src/process.cc17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/process.cc b/src/process.cc
index fda35e8..bfab311 100644
--- a/src/process.cc
+++ b/src/process.cc
@@ -59,9 +59,11 @@ void process::check(const string& id,configuration& config) {
void process::launch(const string& id,configuration& config) {
- uid_t uid = 0;
+ uid_t uid = (uid_t)-1;
+ gid_t gid = (gid_t)-1;
if(!user.empty()) {
struct passwd *ptmp = getpwnam(user.c_str());
if(ptmp) {
uid = ptmp->pw_uid;
+ gid = ptmp->pw_gid;
}else{
errno=0;
@@ -71,5 +73,4 @@ void process::launch(const string& id,configuration& config) {
}
}
- gid_t gid = 0;
if(!group.empty()) {
struct group *gtmp = getgrnam(group.c_str());
@@ -90,13 +91,15 @@ void process::launch(const string& id,configuration& config) {
try {
setsid();
+ if(user.empty()) {
+ if((getgid()!=gid) && setgid(gid))
+ throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()");
+ }else{
+ if(initgroups(user.c_str(),gid))
+ throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to initgroups()");
+ }
if(!chroot.empty()) {
if(::chroot(chroot.c_str()))
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()");
}
- if(!group.empty()) {
- // TODO: initgroups()?
- if((getgid()!=gid) && setgid(gid))
- throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()");
- }
if(!user.empty()) {
if((getuid()!=uid) && setuid(uid))