Temporarily lock Giant while we update td_ucred. The proc lock doesn't

fully protect p_ucred yet so Giant is needed until all the p_ucred
locking is done.  This is the original reason td_ucred was not used
immediately after its addition.  Unfortunately, not using td_ucred is
not enough to avoid problems.  Since p_ucred could be stale, we could
actually be dereferencing a stale pointer to dink with the refcount, so
we really need Giant to avoid foot-shooting.  This allows td_ucred to
be safely used as well.
This commit is contained in:
John Baldwin 2002-02-27 18:30:01 +00:00
parent 0c934a5eed
commit 65e3406d28

View File

@ -1785,17 +1785,17 @@ void
cred_update_thread(struct thread *td)
{
struct proc *p;
struct ucred *cred;
p = td->td_proc;
if (td->td_ucred != NULL) {
mtx_lock(&Giant);
crfree(td->td_ucred);
mtx_unlock(&Giant);
td->td_ucred = NULL;
}
cred = td->td_ucred;
mtx_lock(&Giant);
PROC_LOCK(p);
td->td_ucred = crhold(p->p_ucred);
PROC_UNLOCK(p);
if (cred != NULL)
crfree(cred);
mtx_unlock(&Giant);
}
/*