The following reply was made to PR kern/41489; it has been noted by GNATS.
From: Elad Efrat <elad@xxxxxxxxxx>
Cc: gnats-bugs@xxxxxxxxxx, netbsd-bugs@xxxxxxxxxx
Subject: Re: kern/41489: setpriority(2) returns EACCES instead of EPERM
Date: Tue, 26 May 2009 00:54:52 +0300
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Matthias Drochner wrote:
> elad@xxxxxxxxxx said:
>> How can you tell I botched it?
> Sorry I usually avoid to point fingers at persons, but in this
> case it was a nicely fitting reply to the question.
> Your change removed a check which returned EPERM in case
> the owner etc didn't match.
My bad: I was looking at the wrong part of the code (specifically the
EACCES at the bottom rather than the EPERM at the top).
Anyway, the fix here isn't so obvious; specifically, the original check
checked both the effective and the real uid ("root" is a user with
effective uid 0). Additionally, the documentation (not ours) doesn't
necessarily specify a super-user, but rather a user with the proper
privileges, which is more correct. We have to decide if we want to
maintain the behavior (uid or euid 0 -> no EPERM, which is IMHO wrong),
fix it (euid 0 -> no EPERM, IMHO right, can simply be a
KAUTH_GENERIC_ISSUSER for now), or do something completely different
(like make listeners return errno values and weigh them, similar to
FreeBSD, long-term goal).
The attached diff is simply restores the original checks.
RCS file: /usr/cvs/src/sys/kern/kern_resource.c,v
retrieving revision 1.151
diff -u -p -r1.151 kern_resource.c
--- sys/kern/kern_resource.c 29 Mar 2009 01:02:50 -0000 1.151
+++ sys/kern/kern_resource.c 25 May 2009 04:05:26 -0000
@@ -229,6 +229,11 @@ donice(struct lwp *l, struct proc *chgp,
+ if (kauth_cred_geteuid(cred) && kauth_cred_getuid(cred) &&
+ kauth_cred_geteuid(cred) != kauth_cred_geteuid(chgp->p_cred) &&
+ kauth_cred_getuid(cred) != kauth_cred_geteuid(chgp->p_cred))
+ return (EPERM);
if (n > PRIO_MAX)
n = PRIO_MAX;
if (n < PRIO_MIN)