aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/svr4/svr4_sysvec.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2001-01-23 21:33:55 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2001-01-23 21:33:55 +0000
commit1fed5f0326a1084ca2d6ec546e50fcf19c27b1a5 (patch)
tree7d8f73d3cc9ae6db91983828052ff1fcb8b335ab /sys/compat/svr4/svr4_sysvec.c
parentc41e968cbd63de3ed7132399fe690dd2cc2c7f76 (diff)
downloadsrc-1fed5f0326a1084ca2d6ec546e50fcf19c27b1a5.tar.gz
src-1fed5f0326a1084ca2d6ec546e50fcf19c27b1a5.zip
Proc locking.
Notes
Notes: svn path=/head/; revision=71454
Diffstat (limited to 'sys/compat/svr4/svr4_sysvec.c')
-rw-r--r--sys/compat/svr4/svr4_sysvec.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/compat/svr4/svr4_sysvec.c b/sys/compat/svr4/svr4_sysvec.c
index f314d1d3cb63..dfddb7153c3e 100644
--- a/sys/compat/svr4/svr4_sysvec.c
+++ b/sys/compat/svr4/svr4_sysvec.c
@@ -212,10 +212,12 @@ svr4_fixup(register_t **stack_base, struct image_params *imgp)
AUXARGS_ENTRY(pos, AT_FLAGS, args->flags);
AUXARGS_ENTRY(pos, AT_ENTRY, args->entry);
AUXARGS_ENTRY(pos, AT_BASE, args->base);
+ PROC_LOCK(imgp->proc);
AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_cred->p_ruid);
AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_cred->p_svuid);
AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_cred->p_rgid);
AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_cred->p_svgid);
+ PROC_UNLOCK(imgp->proc);
AUXARGS_ENTRY(pos, AT_NULL, 0);
free(imgp->auxargs, M_TEMP);
@@ -249,6 +251,7 @@ svr4_emul_find(p, sgp, prefix, path, pbuf, cflag)
struct nameidata ndroot;
struct vattr vat;
struct vattr vatroot;
+ struct ucred *uc;
int error;
char *ptr, *buf, *cp;
size_t sz, len;
@@ -329,14 +332,20 @@ svr4_emul_find(p, sgp, prefix, path, pbuf, cflag)
}
NDFREE(&ndroot, NDF_ONLY_PNBUF);
- if ((error = VOP_GETATTR(nd.ni_vp, &vat, p->p_ucred, p)) != 0) {
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
+ if ((error = VOP_GETATTR(nd.ni_vp, &vat, uc, p)) != 0) {
+ crfree(uc);
goto done;
}
- if ((error = VOP_GETATTR(ndroot.ni_vp, &vatroot, p->p_ucred, p))
- != 0) {
+ if ((error = VOP_GETATTR(ndroot.ni_vp, &vatroot, uc, p)) != 0) {
+ crfree(uc);
goto done;
}
+ crfree(uc);
if (vat.va_fsid == vatroot.va_fsid &&
vat.va_fileid == vatroot.va_fileid) {