diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-24 10:42:55 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-09 16:29:03 -0500 |
commit | c0371da6047abd261bc483c744dbc7d81a116172 (patch) | |
tree | 73b4d685f311a83e04f3a684ce18225b409b3f5f /net/socket.c | |
parent | d838df2e5dcbb6ed4d82854869e9a30f9aeef6da (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.c | 27 |
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 | ||