From 4bf0717e5141518c1d34ac84253d3973be1fa260 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 16 Apr 2018 17:35:43 -0400 Subject: 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. --- src/unistd/nice.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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; } -- cgit v1.2.1