diff options
author | David S. Miller <davem@davemloft.net> | 2010-10-28 11:41:55 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-28 11:47:52 -0700 |
commit | 8acfe468b0384e834a303f08ebc4953d72fb690a (patch) | |
tree | 7ecee335efdbd283a122bcba1d5d9b533906142a /include | |
parent | 349f6c5c5d827db909a69e5b9e844e8623c8e881 (diff) | |
download | linux-8acfe468b0384e834a303f08ebc4953d72fb690a.tar.gz linux-8acfe468b0384e834a303f08ebc4953d72fb690a.tar.bz2 linux-8acfe468b0384e834a303f08ebc4953d72fb690a.zip |
net: Limit socket I/O iovec total length to INT_MAX.
This helps protect us from overflow issues down in the
individual protocol sendmsg/recvmsg handlers. Once
we hit INT_MAX we truncate out the rest of the iovec
by setting the iov_len members to zero.
This works because:
1) For SOCK_STREAM and SOCK_SEQPACKET sockets, partial
writes are allowed and the application will just continue
with another write to send the rest of the data.
2) For datagram oriented sockets, where there must be a
one-to-one correspondance between write() calls and
packets on the wire, INT_MAX is going to be far larger
than the packet size limit the protocol is going to
check for and signal with -EMSGSIZE.
Based upon a patch by Linus Torvalds.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/socket.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h index 5146b50202ce..86b652fabf6e 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -322,7 +322,7 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, int offset, unsigned int len, __wsum *csump); -extern long verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); +extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, int mode); extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len); extern int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, int offset, int len); |