summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/sendfile.c
diff options
context:
space:
mode:
authorMarcel Telka <marcel@telka.sk>2018-07-25 12:06:18 +0200
committerRichard Lowe <richlowe@richlowe.net>2018-08-06 19:38:36 +0000
commit8cd3131235b232e4d63be3cf95ce9be87907e74f (patch)
treec34e078f3457f8e62ab2e96a3c3e054e9543e083 /usr/src/uts/common/syscall/sendfile.c
parent6f01cc523b60037ee932665003f61f7fc34735e2 (diff)
downloadillumos-gate-8cd3131235b232e4d63be3cf95ce9be87907e74f.tar.gz
9669 Extra zeros sent by sendfile()
Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/uts/common/syscall/sendfile.c')
-rw-r--r--usr/src/uts/common/syscall/sendfile.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/usr/src/uts/common/syscall/sendfile.c b/usr/src/uts/common/syscall/sendfile.c
index 822f14416c..0cfafbf13f 100644
--- a/usr/src/uts/common/syscall/sendfile.c
+++ b/usr/src/uts/common/syscall/sendfile.c
@@ -953,13 +953,27 @@ sendvec_chunk(file_t *fp, u_offset_t *fileoff, struct sendfilevec *sfv,
if (socket_setsockopt(VTOSO(vp),
SOL_SOCKET, SO_SND_COPYAVOID,
&on, sizeof (on), CRED()) == 0)
- segmapit = 1;
+ segmapit = 1;
}
}
if (segmapit) {
+ struct vattr va;
boolean_t nowait;
+ va.va_mask = AT_SIZE;
+ error = VOP_GETATTR(readvp, &va, 0, kcred,
+ NULL);
+ if (error != 0 || sfv_off >= va.va_size) {
+ VOP_RWUNLOCK(readvp, V_WRITELOCK_FALSE,
+ NULL);
+ releasef(sfv->sfv_fd);
+ return (error);
+ }
+ /* Read as much as possible. */
+ if (sfv_off + sfv_len > va.va_size)
+ sfv_len = va.va_size - sfv_off;
+
nowait = (sfv->sfv_flag & SFV_NOWAIT) != 0;
error = snf_segmap(fp, readvp, sfv_off,
(u_offset_t)sfv_len, (ssize_t *)&cnt,