X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Funistd%2Fnice.c;h=1c2295ffc6591e7642cf17c352dfce7e168dad73;hb=3aba2150d0efc80df30d7fc6c22d6041e14d445e;hp=f38db678d892c7c570e2f4226090922bda1d55c5;hpb=2cdfb7ca26f46f151afbc23d5d94fc68597137f5;p=musl diff --git a/src/unistd/nice.c b/src/unistd/nice.c index f38db678..1c2295ff 100644 --- a/src/unistd/nice.c +++ b/src/unistd/nice.c @@ -1,12 +1,23 @@ #include +#include #include +#include #include "syscall.h" int nice(int inc) { -#ifdef __NR_nice - return syscall1(__NR_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; + if (setpriority(PRIO_PROCESS, 0, prio)) { + if (errno == EACCES) + errno = EPERM; + return -1; + } else { + return prio; + } }