Subject: Re: Process credentials change
To: Bill Studenmund <wrstuden@netbsd.org>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 07/10/2006 15:45:49
On Jul 10, 2006, at 3:30 PM, Bill Studenmund wrote:
> I'm not sure about the cause&effect here. :-) I DO agree that we don't
> want an lwp to change credentials in the middle of a systemcall.
> However a
> shared lock with upgrade to exclusive will also do that. :-)
1- Shared -> Exclusive "upgrades" are an icky concept that we happen
to have in lockmgr(), but I would prefer we NOT proliferate.
2- The key to scalability is to AVOID locking where you can. Why
block another thread that wants to change the process's credentials
just because another thread in the same process is waiting for disk I/
O? You avoid contention for the lock when you have a nice short code
path like this:
void
lwp_cache_creds(proc_t p, lwp_t l)
{
ocreds = NULL;
mutex_lock(&p->p_cred_mutex);
if (l->l_cred != p->p_cred) {
ocreds = l->l_cred;
l->l_cred = p->p_cred;
kauth_cred_retain(l->l_cred);
}
mutex_unlock(&p->p_cred_mutex);
if (ocreds != NULL)
kauth_cred_release(ocreds);
}
...and you don't have to take the lock again.
Let's try and design for scalability NOW rather than have to retrofit
it in later.
> But doing the above has an impact on changing credentials. We will
> return
> success on changing credentials before we've realy finished the
> change.
> Yes, we've put things in place so the NEXT system call will use the
> new
> creds, we are still using the old ones. If the unchanged LWP stays
> in the
> kernel "for a while", then we have a measure of shadiness.
Assuming that an LWP entered the kernel with rights to perform an
action, it stands to reason that it should be allowed to complete
that action.
> How do other OSs handle this? Do they care?
I haven't looked into how the "change creds of the proc while threads
are blocked in the kernel" aspect, but I know that Mac OS X 10.4 has
per-thread credentials. The AFP server uses this to ensure that
requests are processed as the user logged into the session.
-- thorpej