From: Rich Felker Date: Mon, 16 Apr 2018 21:35:43 +0000 (-0400) Subject: fix return value of nice function X-Git-Tag: v1.1.20~124 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4bf0717e5141518c1d34ac84253d3973be1fa260;p=oweals%2Fmusl.git fix return value of nice function the Linux SYS_nice syscall is unusable because it does not return the newly set priority. always use SYS_setpriority. also avoid overflows in addition of inc by handling large inc values directly without examining the old nice value. --- diff --git a/src/unistd/nice.c b/src/unistd/nice.c index da569967..6c25c8c3 100644 --- a/src/unistd/nice.c +++ b/src/unistd/nice.c @@ -1,12 +1,16 @@ #include #include +#include #include "syscall.h" int nice(int inc) { -#ifdef SYS_nice - return syscall(SYS_nice, inc); -#else - return setpriority(PRIO_PROCESS, 0, getpriority(PRIO_PROCESS, 0)+inc); -#endif + int prio = inc; + // Only query old priority if it can affect the result. + // This also avoids issues with integer overflow. + if (inc > -2*NZERO && inc < 2*NZERO) + prio += getpriority(PRIO_PROCESS, 0); + if (prio > NZERO-1) prio = NZERO-1; + if (prio < -NZERO) prio = -NZERO; + return setpriority(PRIO_PROCESS, 0, prio) ? -1 : prio; }