diff options
author | Marcel Telka <marcel@telka.sk> | 2018-07-25 12:06:18 +0200 |
---|---|---|
committer | Richard Lowe <richlowe@richlowe.net> | 2018-08-06 19:38:36 +0000 |
commit | 8cd3131235b232e4d63be3cf95ce9be87907e74f (patch) | |
tree | c34e078f3457f8e62ab2e96a3c3e054e9543e083 /usr/src/uts/common/syscall/sendfile.c | |
parent | 6f01cc523b60037ee932665003f61f7fc34735e2 (diff) | |
download | illumos-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.c | 16 |
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, |