instance: handle setgid() before setuid()
[project/procd.git] / service / instance.c
index 1fb65fa04d9343b2606cd0dd5975d490b72c8c58..33678851e6321160c2a24609ee8a86dac599035d 100644 (file)
@@ -282,12 +282,15 @@ instance_run(struct service_instance *in, int _stdout, int _stderr)
                closefd(_stderr);
        }
 
-       if (in->uid || in->gid) {
-               if (setuid(in->uid) || setgid(in->gid)) {
-                       ERROR("failed to set uid:%d, gid:%d\n", in->uid, in->gid);
-                       exit(127);
-               }
+       if (in->gid && setgid(in->gid)) {
+               ERROR("failed to set group id %d: %d (%s)\n", in->gid, errno, strerror(errno));
+               exit(127);
+       }
+       if (in->uid && setuid(in->uid)) {
+               ERROR("failed to set user id %d: %d (%s)\n", in->uid, errno, strerror(errno));
+               exit(127);
        }
+
        execvp(argv[0], argv);
        exit(127);
 }