summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Lewis <truckman@FreeBSD.org>2000-09-20 12:21:20 +0000
committerDon Lewis <truckman@FreeBSD.org>2000-09-20 12:21:20 +0000
commit453942efb583ea83b2074f273261b71f8a1af0ce (patch)
tree8d7d002917192f117e39bb60eddf5cb8c632616e
parent0d8353ac60a74cf5f762134290a5cfbad6982d33 (diff)
Notes
-rw-r--r--sys/kern/vfs_syscalls.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 3255ff2d1396..dae186c9f6ca 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -1524,15 +1524,21 @@ access(p, uap)
syscallarg(int) flags;
} */ *uap;
{
- register struct ucred *cred = p->p_ucred;
+ struct ucred *cred, *tmpcred;
register struct vnode *vp;
- int error, flags, t_gid, t_uid;
+ int error, flags;
struct nameidata nd;
- t_uid = cred->cr_uid;
- t_gid = cred->cr_groups[0];
- cred->cr_uid = p->p_cred->p_ruid;
- cred->cr_groups[0] = p->p_cred->p_rgid;
+ cred = p->p_ucred;
+ /*
+ * Create and modify a temporary credential instead of one that
+ * is potentially shared. This could also mess up socket
+ * buffer accounting which can run in an interrupt context.
+ */
+ tmpcred = crdup(cred);
+ tmpcred->cr_uid = p->p_cred->p_ruid;
+ tmpcred->cr_groups[0] = p->p_cred->p_rgid;
+ p->p_ucred = tmpcred;
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | NOOBJ, UIO_USERSPACE,
SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
@@ -1554,8 +1560,8 @@ access(p, uap)
NDFREE(&nd, NDF_ONLY_PNBUF);
vput(vp);
out1:
- cred->cr_uid = t_uid;
- cred->cr_groups[0] = t_gid;
+ p->p_ucred = cred;
+ crfree(tmpcred);
return (error);
}