summaryrefslogtreecommitdiff
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authorBrian Feldman <green@FreeBSD.org>1999-10-14 05:37:52 +0000
committerBrian Feldman <green@FreeBSD.org>1999-10-14 05:37:52 +0000
commit1aa3e7ddd0c0c9583cce288893fcdf124c57b4c9 (patch)
tree7f7118b577e4903d6b34998437bb07c30d3a43bf /sys/kern/sys_generic.c
parentafce0034532569734bed6027a1468bedc20c352d (diff)
Notes
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 8eb0efeb2740..88c7d7f6bdb3 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -405,11 +405,15 @@ writev(p, uap)
if ((fp = getfp(fdp, uap->fd, FWRITE)) == NULL)
return (EBADF);
+ fhold(fp);
/* note: can't use iovlen until iovcnt is validated */
iovlen = uap->iovcnt * sizeof (struct iovec);
if (uap->iovcnt > UIO_SMALLIOV) {
- if (uap->iovcnt > UIO_MAXIOV)
- return (EINVAL);
+ if (uap->iovcnt > UIO_MAXIOV) {
+ needfree = NULL;
+ error = EINVAL;
+ goto done;
+ }
MALLOC(iov, struct iovec *, iovlen, M_IOV, M_WAITOK);
needfree = iov;
} else {
@@ -461,6 +465,7 @@ writev(p, uap)
#endif
p->p_retval[0] = cnt;
done:
+ fdrop(fp);
if (needfree)
FREE(needfree, M_IOV);
return (error);