summaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-11-24 10:42:55 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-12-09 16:29:03 -0500
commitc0371da6047abd261bc483c744dbc7d81a116172 (patch)
tree73b4d685f311a83e04f3a684ce18225b409b3f5f /net/socket.c
parentd838df2e5dcbb6ed4d82854869e9a30f9aeef6da (diff)
put iov_iter into msghdr
Note that the code _using_ ->msg_iter at that point will be very unhappy with anything other than unshifted iovec-backed iov_iter. We still need to convert users to proper primitives. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/net/socket.c b/net/socket.c
index f676ac4a3701..8809afccf7fa 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -689,8 +689,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
689 * the following is safe, since for compiler definitions of kvec and 689 * the following is safe, since for compiler definitions of kvec and
690 * iovec are identical, yielding the same in-core layout and alignment 690 * iovec are identical, yielding the same in-core layout and alignment
691 */ 691 */
692 msg->msg_iov = (struct iovec *)vec; 692 iov_iter_init(&msg->msg_iter, WRITE, (struct iovec *)vec, num, size);
693 msg->msg_iovlen = num;
694 result = sock_sendmsg(sock, msg, size); 693 result = sock_sendmsg(sock, msg, size);
695 set_fs(oldfs); 694 set_fs(oldfs);
696 return result; 695 return result;
@@ -853,7 +852,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
853 * the following is safe, since for compiler definitions of kvec and 852 * the following is safe, since for compiler definitions of kvec and
854 * iovec are identical, yielding the same in-core layout and alignment 853 * iovec are identical, yielding the same in-core layout and alignment
855 */ 854 */
856 msg->msg_iov = (struct iovec *)vec, msg->msg_iovlen = num; 855 iov_iter_init(&msg->msg_iter, READ, (struct iovec *)vec, num, size);
857 result = sock_recvmsg(sock, msg, size, flags); 856 result = sock_recvmsg(sock, msg, size, flags);
858 set_fs(oldfs); 857 set_fs(oldfs);
859 return result; 858 return result;
@@ -913,8 +912,7 @@ static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
913 msg->msg_namelen = 0; 912 msg->msg_namelen = 0;
914 msg->msg_control = NULL; 913 msg->msg_control = NULL;
915 msg->msg_controllen = 0; 914 msg->msg_controllen = 0;
916 msg->msg_iov = (struct iovec *)iov; 915 iov_iter_init(&msg->msg_iter, READ, iov, nr_segs, size);
917 msg->msg_iovlen = nr_segs;
918 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; 916 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
919 917
920 return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags); 918 return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags);
@@ -953,8 +951,7 @@ static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
953 msg->msg_namelen = 0; 951 msg->msg_namelen = 0;
954 msg->msg_control = NULL; 952 msg->msg_control = NULL;
955 msg->msg_controllen = 0; 953 msg->msg_controllen = 0;
956 msg->msg_iov = (struct iovec *)iov; 954 iov_iter_init(&msg->msg_iter, WRITE, iov, nr_segs, size);
957 msg->msg_iovlen = nr_segs;
958 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; 955 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
959 if (sock->type == SOCK_SEQPACKET) 956 if (sock->type == SOCK_SEQPACKET)
960 msg->msg_flags |= MSG_EOR; 957 msg->msg_flags |= MSG_EOR;
@@ -1798,8 +1795,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1798 iov.iov_base = buff; 1795 iov.iov_base = buff;
1799 iov.iov_len = len; 1796 iov.iov_len = len;
1800 msg.msg_name = NULL; 1797 msg.msg_name = NULL;
1801 msg.msg_iov = &iov; 1798 iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, len);
1802 msg.msg_iovlen = 1;
1803 msg.msg_control = NULL; 1799 msg.msg_control = NULL;
1804 msg.msg_controllen = 0; 1800 msg.msg_controllen = 0;
1805 msg.msg_namelen = 0; 1801 msg.msg_namelen = 0;
@@ -1856,10 +1852,9 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1856 1852
1857 msg.msg_control = NULL; 1853 msg.msg_control = NULL;
1858 msg.msg_controllen = 0; 1854 msg.msg_controllen = 0;
1859 msg.msg_iovlen = 1;
1860 msg.msg_iov = &iov;
1861 iov.iov_len = size; 1855 iov.iov_len = size;
1862 iov.iov_base = ubuf; 1856 iov.iov_base = ubuf;
1857 iov_iter_init(&msg.msg_iter, READ, &iov, 1, size);
1863 /* Save some cycles and don't copy the address if not needed */ 1858 /* Save some cycles and don't copy the address if not needed */
1864 msg.msg_name = addr ? (struct sockaddr *)&address : NULL; 1859 msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
1865 /* We assume all kernel code knows the size of sockaddr_storage */ 1860 /* We assume all kernel code knows the size of sockaddr_storage */
@@ -1993,13 +1988,14 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1993{ 1988{
1994 struct sockaddr __user *uaddr; 1989 struct sockaddr __user *uaddr;
1995 struct iovec __user *uiov; 1990 struct iovec __user *uiov;
1991 size_t nr_segs;
1996 ssize_t err; 1992 ssize_t err;
1997 1993
1998 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) || 1994 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) ||
1999 __get_user(uaddr, &umsg->msg_name) || 1995 __get_user(uaddr, &umsg->msg_name) ||
2000 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) || 1996 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) ||
2001 __get_user(uiov, &umsg->msg_iov) || 1997 __get_user(uiov, &umsg->msg_iov) ||
2002 __get_user(kmsg->msg_iovlen, &umsg->msg_iovlen) || 1998 __get_user(nr_segs, &umsg->msg_iovlen) ||
2003 __get_user(kmsg->msg_control, &umsg->msg_control) || 1999 __get_user(kmsg->msg_control, &umsg->msg_control) ||
2004 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || 2000 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) ||
2005 __get_user(kmsg->msg_flags, &umsg->msg_flags)) 2001 __get_user(kmsg->msg_flags, &umsg->msg_flags))
@@ -2029,14 +2025,15 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
2029 kmsg->msg_namelen = 0; 2025 kmsg->msg_namelen = 0;
2030 } 2026 }
2031 2027
2032 if (kmsg->msg_iovlen > UIO_MAXIOV) 2028 if (nr_segs > UIO_MAXIOV)
2033 return -EMSGSIZE; 2029 return -EMSGSIZE;
2034 2030
2035 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 2031 err = rw_copy_check_uvector(save_addr ? READ : WRITE,
2036 uiov, kmsg->msg_iovlen, 2032 uiov, nr_segs,
2037 UIO_FASTIOV, *iov, iov); 2033 UIO_FASTIOV, *iov, iov);
2038 if (err >= 0) 2034 if (err >= 0)
2039 kmsg->msg_iov = *iov; 2035 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
2036 *iov, nr_segs, err);
2040 return err; 2037 return err;
2041} 2038}
2042 2039