summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
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 8eb0efe..88c7d7f 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);
OpenPOWER on IntegriCloud