runit: fix chpst -n -N -u USER
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 13 Mar 2017 21:32:05 +0000 (22:32 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 13 Mar 2017 21:35:30 +0000 (22:35 +0100)
busybox's chpst first switches user/group and then tries to call nice().
Once the root priviledges are dropped, process priority can only be lowered.
So negative nice values don't work anymore.
Upstream version of chpst correctly calls nice() before switching user.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
runit/chpst.c

index 846c846d3052105f6ad00d1d61b84ab6c3e2b85e..ee3a33153d71059cfcedc6679564ee3abb162bed 100644 (file)
@@ -463,6 +463,13 @@ int chpst_main(int argc UNUSED_PARAM, char **argv)
                xchroot(root);
        }
 
+       /* nice should be done before xsetuid */
+       if (opt & OPT_n) {
+               errno = 0;
+               if (nice(xatoi(nicestr)) == -1)
+                       bb_perror_msg_and_die("nice");
+       }
+
        if (opt & OPT_u) {
                if (setgroups(1, &ugid.gid) == -1)
                        bb_perror_msg_and_die("setgroups");
@@ -470,12 +477,6 @@ int chpst_main(int argc UNUSED_PARAM, char **argv)
                xsetuid(ugid.uid);
        }
 
-       if (opt & OPT_n) {
-               errno = 0;
-               if (nice(xatoi(nicestr)) == -1)
-                       bb_perror_msg_and_die("nice");
-       }
-
        if (opt & OPT_0)
                close(STDIN_FILENO);
        if (opt & OPT_1)