summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authoranders <Anders.Persson@Sun.COM>2008-12-17 18:28:34 -0800
committeranders <Anders.Persson@Sun.COM>2008-12-17 18:28:34 -0800
commit07d13e573541b3558ff2c74bdbb227165aa597a7 (patch)
tree74f4a922d5961581f3d26e329ff1956434ca71c7 /usr/src
parent08ac1c49adeb1b81324fa4e70a922581ad7ec309 (diff)
downloadillumos-joyent-07d13e573541b3558ff2c74bdbb227165aa597a7.tar.gz
6785994 sendfilev() can return unexpected errno for non-TCP sockets
6786057 mismerge in sendvec_chunk() can causes sendfilev() to fail when writing to regular file
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/sockfs/sockcommon_sops.c3
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c3
-rw-r--r--usr/src/uts/common/sys/socketvar.h2
-rw-r--r--usr/src/uts/common/syscall/sendfile.c3
4 files changed, 6 insertions, 5 deletions
diff --git a/usr/src/uts/common/fs/sockfs/sockcommon_sops.c b/usr/src/uts/common/fs/sockfs/sockcommon_sops.c
index 6fbfaa973e..305657ded9 100644
--- a/usr/src/uts/common/fs/sockfs/sockcommon_sops.c
+++ b/usr/src/uts/common/fs/sockfs/sockcommon_sops.c
@@ -513,7 +513,8 @@ so_sendmblk(struct sonode *so, struct nmsghdr *msg, int fflag,
(fflag & (FNONBLOCK|FNDELAY));
size = msgdsize(mp);
- if (so->so_downcalls->sd_send == NULL) {
+ if ((so->so_mode & SM_SENDFILESUPP) == 0 ||
+ so->so_downcalls->sd_send == NULL) {
SO_UNBLOCK_FALLBACK(so);
return (EOPNOTSUPP);
}
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index 4ac44ec799..82b4055a3f 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -27447,7 +27447,8 @@ tcp_create(int family, int type, int proto, sock_downcalls_t **sock_downcalls,
ASSERT(errorp != NULL);
*errorp = 0;
*sock_downcalls = &sock_tcp_downcalls;
- *smodep = SM_CONNREQUIRED | SM_EXDATA | SM_ACCEPTSUPP;
+ *smodep = SM_CONNREQUIRED | SM_EXDATA | SM_ACCEPTSUPP |
+ SM_SENDFILESUPP;
return ((sock_lower_handle_t)connp);
}
diff --git a/usr/src/uts/common/sys/socketvar.h b/usr/src/uts/common/sys/socketvar.h
index a5df70bde2..c4febdf4a2 100644
--- a/usr/src/uts/common/sys/socketvar.h
+++ b/usr/src/uts/common/sys/socketvar.h
@@ -342,7 +342,9 @@ struct sonode {
#define SM_KERNEL 0x200 /* kernel socket */
+/* The modes below are only for non-streams sockets */
#define SM_ACCEPTSUPP 0x400 /* can handle accept() */
+#define SM_SENDFILESUPP 0x800 /* Private: proto supp sendfile */
/*
* Socket versions. Used by the socket library when calling _so_socket().
diff --git a/usr/src/uts/common/syscall/sendfile.c b/usr/src/uts/common/syscall/sendfile.c
index 13b480a304..ec7efdcf25 100644
--- a/usr/src/uts/common/syscall/sendfile.c
+++ b/usr/src/uts/common/syscall/sendfile.c
@@ -815,9 +815,6 @@ sendvec_chunk(file_t *fp, u_offset_t *fileoff, struct sendfilevec *sfv,
sfv_off += iov_len;
}
} else {
- ttolwp(curthread)->lwp_ru.ioch +=
- (ulong_t)sfv_len;
- *count += sfv_len;
aiov.iov_len = sfv_len;
aiov.iov_base = (caddr_t)(uintptr_t)sfv_off;