summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2002-07-10 06:31:35 +0000
committertruckman <truckman@FreeBSD.org>2002-07-10 06:31:35 +0000
commit69db9157a1ee493092695e831e76589da3058af6 (patch)
tree50f76dfec12efdd4cc321a48a1290670cf92ac09 /sys
parentbc0fd33965e54aa0fe4d5a89c266629a43dce59e (diff)
downloadFreeBSD-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.c17
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);
OpenPOWER on IntegriCloud