From 1fed5f0326a1084ca2d6ec546e50fcf19c27b1a5 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 23 Jan 2001 21:33:55 +0000 Subject: [PATCH] Proc locking. --- sys/compat/svr4/imgact_svr4.c | 2 ++ sys/compat/svr4/svr4_fcntl.c | 41 +++++++++++++++++++++++++-------- sys/compat/svr4/svr4_resource.c | 8 +++++++ sys/compat/svr4/svr4_signal.c | 14 +++++++---- sys/compat/svr4/svr4_sysvec.c | 15 +++++++++--- 5 files changed, 63 insertions(+), 17 deletions(-) diff --git a/sys/compat/svr4/imgact_svr4.c b/sys/compat/svr4/imgact_svr4.c index a244d7b87e9a..ae4f7d21b042 100644 --- a/sys/compat/svr4/imgact_svr4.c +++ b/sys/compat/svr4/imgact_svr4.c @@ -101,6 +101,8 @@ exec_svr4_imgact(imgp) /* text + data can't exceed file size */ if (a_out->a_data + a_out->a_text > imgp->attr->va_size) return (EFAULT); + /* For p_rlimit below. */ + mtx_assert(&Giant, MA_OWNED); /* * text/data/bss must not exceed limits */ diff --git a/sys/compat/svr4/svr4_fcntl.c b/sys/compat/svr4/svr4_fcntl.c index fb71d9a9d2f2..3b8adad418e8 100644 --- a/sys/compat/svr4/svr4_fcntl.c +++ b/sys/compat/svr4/svr4_fcntl.c @@ -249,6 +249,7 @@ fd_revoke(p, fd) struct vnode *vp; struct mount *mp; struct vattr vattr; + struct ucred *uc; int error, *retval; retval = p->p_retval; @@ -265,12 +266,20 @@ fd_revoke(p, fd) goto out; } - if ((error = VOP_GETATTR(vp, &vattr, p->p_ucred, p)) != 0) + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + if ((error = VOP_GETATTR(vp, &vattr, uc, p)) != 0) { + crfree(uc); goto out; + } - if (p->p_ucred->cr_uid != vattr.va_uid && - (error = suser(p)) != 0) + if (uc->cr_uid != vattr.va_uid && (error = suser(p)) != 0) { + crfree(uc); goto out; + } + crfree(uc); if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) goto out; @@ -294,6 +303,7 @@ fd_truncate(p, fd, flp) off_t start, length; struct vnode *vp; struct vattr vattr; + struct ucred *uc; int error, *retval; struct ftruncate_args ft; @@ -309,7 +319,13 @@ fd_truncate(p, fd, flp) if (fp->f_type != DTYPE_VNODE || vp->v_type == VFIFO) return ESPIPE; - if ((error = VOP_GETATTR(vp, &vattr, p->p_ucred, p)) != 0) + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = VOP_GETATTR(vp, &vattr, uc, p); + crfree(uc); + if (error != 0) return error; length = vattr.va_size; @@ -366,17 +382,23 @@ svr4_sys_open(p, uap) retval = p->p_retval[0]; + PROC_LOCK(p); if (!(SCARG(&cup, flags) & O_NOCTTY) && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) { #if defined(NOTYET) struct filedesc *fdp = p->p_fd; struct file *fp = fdp->fd_ofiles[retval]; + PROC_UNLOCK(p); /* ignore any error, just give it a try */ if (fp->f_type == DTYPE_VNODE) fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0, p); -#endif + } else + PROC_UNLOCK(p); +#else } + PROC_UNLOCK(p); +#endif return error; } @@ -414,20 +436,19 @@ svr4_sys_creat64(p, uap) } int -svr4_sys_llseek(p, v) +svr4_sys_llseek(p, uap) register struct proc *p; - struct svr4_sys_llseek_args *v; + struct svr4_sys_llseek_args *uap; { - struct svr4_sys_llseek_args *uap = v; struct lseek_args ap; SCARG(&ap, fd) = SCARG(uap, fd); #if BYTE_ORDER == BIG_ENDIAN - SCARG(&ap, offset) = (((long long) SCARG(uap, offset1)) << 32) | + SCARG(&ap, offset) = (((u_int64_t) SCARG(uap, offset1)) << 32) | SCARG(uap, offset2); #else - SCARG(&ap, offset) = (((long long) SCARG(uap, offset2)) << 32) | + SCARG(&ap, offset) = (((u_int64_t) SCARG(uap, offset2)) << 32) | SCARG(uap, offset1); #endif SCARG(&ap, whence) = SCARG(uap, whence); diff --git a/sys/compat/svr4/svr4_resource.c b/sys/compat/svr4/svr4_resource.c index c5593453822e..873782120d18 100644 --- a/sys/compat/svr4/svr4_resource.c +++ b/sys/compat/svr4/svr4_resource.c @@ -138,6 +138,8 @@ svr4_sys_getrlimit(p, uap) if (rl == -1) return EINVAL; + /* For p_rlimit. */ + mtx_assert(&Giant, MA_OWNED); blim = p->p_rlimit[rl]; /* @@ -184,6 +186,8 @@ svr4_sys_setrlimit(p, uap) if (rl == -1) return EINVAL; + /* For p_rlimit. */ + mtx_assert(&Giant, MA_OWNED); limp = &p->p_rlimit[rl]; if ((error = copyin(SCARG(uap, rlp), &slim, sizeof(slim))) != 0) @@ -232,6 +236,8 @@ svr4_sys_getrlimit64(p, uap) if (rl == -1) return EINVAL; + /* For p_rlimit. */ + mtx_assert(&Giant, MA_OWNED); blim = p->p_rlimit[rl]; /* @@ -278,6 +284,8 @@ svr4_sys_setrlimit64(p, uap) if (rl == -1) return EINVAL; + /* For p_rlimit. */ + mtx_assert(&Giant, MA_OWNED); limp = &p->p_rlimit[rl]; if ((error = copyin(SCARG(uap, rlp), &slim, sizeof(slim))) != 0) diff --git a/sys/compat/svr4/svr4_signal.c b/sys/compat/svr4/svr4_signal.c index 8b4e2aff0723..87b9c7857e87 100644 --- a/sys/compat/svr4/svr4_signal.c +++ b/sys/compat/svr4/svr4_signal.c @@ -480,7 +480,9 @@ svr4_sys_signal(p, uap) sigset_t *set; set = stackgap_alloc(&sg, sizeof(sigset_t)); + PROC_LOCK(p); *set = p->p_sigmask; + PROC_UNLOCK(p); SIGDELSET(*set, signum); SCARG(&sa, sigmask) = set; return sigsuspend(p, &sa); @@ -504,7 +506,9 @@ svr4_sys_sigprocmask(p, uap) retval = p->p_retval; if (SCARG(uap, oset) != NULL) { /* Fix the return value first if needed */ + PROC_LOCK(p); bsd_to_svr4_sigset(&p->p_sigmask, &sss); + PROC_UNLOCK(p); if ((error = copyout(&sss, SCARG(uap, oset), sizeof(sss))) != 0) return error; } @@ -518,8 +522,7 @@ svr4_sys_sigprocmask(p, uap) svr4_to_bsd_sigset(&sss, &bss); - (void) splhigh(); - + PROC_LOCK(p); switch (SCARG(uap, how)) { case SVR4_SIG_BLOCK: SIGSETOR(p->p_sigmask, bss); @@ -539,8 +542,7 @@ svr4_sys_sigprocmask(p, uap) error = EINVAL; break; } - - (void) spl0(); + PROC_UNLOCK(p); return error; } @@ -560,8 +562,10 @@ svr4_sys_sigpending(p, uap) case 1: /* sigpending */ if (SCARG(uap, mask) == NULL) return 0; + PROC_LOCK(p); bss = p->p_siglist; SIGSETAND(bss, p->p_sigmask); + PROC_UNLOCK(p); bsd_to_svr4_sigset(&bss, &sss); break; @@ -628,9 +632,11 @@ svr4_sys_context(p, uap) switch (uap->func) { case 0: + PROC_LOCK(p); DPRINTF(("getcontext(%p)\n", uap->uc)); svr4_getcontext(p, &uc, &p->p_sigmask, sigonstack(cpu_getstack(p))); + PROC_UNLOCK(p); return copyout(&uc, uap->uc, sizeof(uc)); case 1: 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) {