diff options
author | John Baldwin <jhb@FreeBSD.org> | 2001-01-23 21:33:55 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2001-01-23 21:33:55 +0000 |
commit | 1fed5f0326a1084ca2d6ec546e50fcf19c27b1a5 (patch) | |
tree | 7d8f73d3cc9ae6db91983828052ff1fcb8b335ab /sys/compat/svr4/svr4_sysvec.c | |
parent | c41e968cbd63de3ed7132399fe690dd2cc2c7f76 (diff) | |
download | src-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.c | 15 |
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) { |