diff options
author | truckman <truckman@FreeBSD.org> | 2002-07-10 06:31:35 +0000 |
---|---|---|
committer | truckman <truckman@FreeBSD.org> | 2002-07-10 06:31:35 +0000 |
commit | 69db9157a1ee493092695e831e76589da3058af6 (patch) | |
tree | 50f76dfec12efdd4cc321a48a1290670cf92ac09 /sys | |
parent | bc0fd33965e54aa0fe4d5a89c266629a43dce59e (diff) | |
download | FreeBSD-src-69db9157a1ee493092695e831e76589da3058af6.zip FreeBSD-src-69db9157a1ee493092695e831e76589da3058af6.tar.gz |
Rearrange the code so that it checks whether the file is something
valid to write a core dump to before doing the preparations to actually
write to the file.
Call VOP_GETATTR() before dropping the initial vnode lock.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_sig.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index dc3aa06..5c1ef0f 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1967,8 +1967,6 @@ toolong: * then it passes on a vnode and a size limit to the process-specific * coredump routine if there is one; if there _is not_ one, it returns * ENOSYS; otherwise it returns the error from the process-specific routine. - * - * XXX: VOP_GETATTR() here requires holding the vnode lock. */ static int @@ -2021,6 +2019,14 @@ restart: NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; + /* Don't dump to non-regular files or files with links. */ + if (vp->v_type != VREG || + VOP_GETATTR(vp, &vattr, cred, td) || vattr.va_nlink != 1) { + VOP_UNLOCK(vp, 0, td); + error = EFAULT; + goto out2; + } + VOP_UNLOCK(vp, 0, td); lf.l_whence = SEEK_SET; lf.l_start = 0; @@ -2040,12 +2046,6 @@ restart: goto restart; } - /* Don't dump to non-regular files or files with links. */ - if (vp->v_type != VREG || - VOP_GETATTR(vp, &vattr, cred, td) || vattr.va_nlink != 1) { - error = EFAULT; - goto out1; - } VATTR_NULL(&vattr); vattr.va_size = 0; vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); @@ -2060,7 +2060,6 @@ restart: p->p_sysent->sv_coredump(td, vp, limit) : ENOSYS; -out1: lf.l_type = F_UNLCK; VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK); vn_finished_write(mp); |