start-stop-daemon: change priority before dropping privileges
authorAitor Esteve Alvarado <aesteve@singularaircraft.com>
Thu, 7 Mar 2019 09:14:48 +0000 (10:14 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 9 Jun 2019 11:47:49 +0000 (13:47 +0200)
Currently start-stop-daemon fails when using both the -c option (set uid)
and -N option (set niceness/priority) as it first drops privileges and then
tries to increase the priority. This patch changes the order of execution.

Signed-off-by: Aitor Esteve Alvarado <aesteve@singularaircraft.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
debianutils/start_stop_daemon.c

index 72642ae7410c4405a5ccdca15eed2b469af78bbf..6fbf8b6de11b39ea30f9d9ed7a5b5ed026b1dbe5 100644 (file)
@@ -537,6 +537,15 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv)
                /* User wants _us_ to make the pidfile */
                write_pidfile(pidfile);
        }
+#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
+       if (opt & OPT_NICELEVEL) {
+               /* Set process priority (must be before OPT_c) */
+               int prio = getpriority(PRIO_PROCESS, 0) + xatoi_range(opt_N, INT_MIN/2, INT_MAX/2);
+               if (setpriority(PRIO_PROCESS, 0, prio) < 0) {
+                       bb_perror_msg_and_die("setpriority(%d)", prio);
+               }
+       }
+#endif
        if (opt & OPT_c) {
                struct bb_uidgid_t ugid;
                parse_chown_usergroup_or_die(&ugid, chuid);
@@ -551,15 +560,6 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv)
                        setgroups(1, &ugid.gid);
                }
        }
-#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
-       if (opt & OPT_NICELEVEL) {
-               /* Set process priority */
-               int prio = getpriority(PRIO_PROCESS, 0) + xatoi_range(opt_N, INT_MIN/2, INT_MAX/2);
-               if (setpriority(PRIO_PROCESS, 0, prio) < 0) {
-                       bb_perror_msg_and_die("setpriority(%d)", prio);
-               }
-       }
-#endif
        /* Try:
         * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 500000
         * should exec "/bin/usleep", but argv[0] should be "qwerty":