diff options
author | anders <Anders.Persson@Sun.COM> | 2008-12-17 18:28:34 -0800 |
---|---|---|
committer | anders <Anders.Persson@Sun.COM> | 2008-12-17 18:28:34 -0800 |
commit | 07d13e573541b3558ff2c74bdbb227165aa597a7 (patch) | |
tree | 74f4a922d5961581f3d26e329ff1956434ca71c7 /usr/src | |
parent | 08ac1c49adeb1b81324fa4e70a922581ad7ec309 (diff) | |
download | illumos-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.c | 3 | ||||
-rw-r--r-- | usr/src/uts/common/inet/tcp/tcp.c | 3 | ||||
-rw-r--r-- | usr/src/uts/common/sys/socketvar.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/syscall/sendfile.c | 3 |
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; |