From ca4be72f67ccf3d94662ed2661e3e55aa159f642 Mon Sep 17 00:00:00 2001 From: Stathis Kamperis Date: Fri, 8 Jan 2010 20:04:44 +0200 Subject: [PATCH] nice(3): Return EPERM if increment is negative. Mandated by POSIX. --- lib/libc/gen/nice.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/libc/gen/nice.c b/lib/libc/gen/nice.c index b5daccc1e7..f537299bdb 100644 --- a/lib/libc/gen/nice.c +++ b/lib/libc/gen/nice.c @@ -48,10 +48,26 @@ nice(int incr) { int prio; + /* + * If we aren't privileged enough to lower our nice value we shall + * return EPERM, contrary to setpriority() which is required to return + * EACCES. + */ + if (incr < 0 && (geteuid() != 0)) { + errno = EPERM; + return (-1); + } + + /* + * -1 is a permissible value in a successful scenario. That's why we + * zero out errno and check against it afterwards, to differentiate + * between a legitimate value and a failure. + */ errno = 0; prio = getpriority(PRIO_PROCESS, 0); if (prio == -1 && errno) return (-1); + if (setpriority(PRIO_PROCESS, 0, prio + incr) == -1) return (-1); return (getpriority(PRIO_PROCESS, 0)); -- 2.41.0