diff options
author | Rich Felker <dalias@aerifal.cx> | 2018-04-16 17:35:43 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2018-04-17 19:23:00 -0400 |
commit | 4bf0717e5141518c1d34ac84253d3973be1fa260 (patch) | |
tree | 3134e9a2e6c812f370d120efcd4f42c49dd7853f /src/unistd | |
parent | 424eab2225ff3f8e3ae9f9eec9dacf2f68b71a2f (diff) | |
download | musl-4bf0717e5141518c1d34ac84253d3973be1fa260.tar.gz musl-4bf0717e5141518c1d34ac84253d3973be1fa260.tar.bz2 musl-4bf0717e5141518c1d34ac84253d3973be1fa260.tar.xz musl-4bf0717e5141518c1d34ac84253d3973be1fa260.zip |
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.
Diffstat (limited to 'src/unistd')
-rw-r--r-- | src/unistd/nice.c | 14 |
1 files 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 <unistd.h> #include <sys/resource.h> +#include <limits.h> #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; } |