From 69db9157a1ee493092695e831e76589da3058af6 Mon Sep 17 00:00:00 2001 From: truckman Date: Wed, 10 Jul 2002 06:31:35 +0000 Subject: [PATCH] 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. --- sys/kern/kern_sig.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index dc3aa06a6bcd..5c1ef0f6516f 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);