diff options
author | Don Lewis <truckman@FreeBSD.org> | 2003-06-19 03:55:01 +0000 |
---|---|---|
committer | Don Lewis <truckman@FreeBSD.org> | 2003-06-19 03:55:01 +0000 |
commit | 8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17 (patch) | |
tree | b118943b530f98aca5a18d8c2a4b59abf9b9e5a0 /sys | |
parent | 82b8b189596f04f8b2560efaef2328d8dcfbc42d (diff) | |
download | src-8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17.tar.gz src-8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17.zip |
VOP_GETVOBJECT() wants to be called with the vnode lock held.
Notes
Notes:
svn path=/head/; revision=116562
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/uipc_syscalls.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 98be6d3006fd..d6b694743f15 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1775,10 +1775,13 @@ do_sendfile(struct thread *td, struct sendfile_args *uap, int compat) */ if ((error = fgetvp_read(td, uap->fd, &vp)) != 0) goto done; + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); if (vp->v_type != VREG || VOP_GETVOBJECT(vp, &obj) != 0) { error = EINVAL; + VOP_UNLOCK(vp, 0, td); goto done; } + VOP_UNLOCK(vp, 0, td); if ((error = fgetsock(td, uap->s, &so, NULL)) != 0) goto done; if (so->so_type != SOCK_STREAM) { |