aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-03-21 19:29:06 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-09 00:02:26 -0400
commitda18428498fb24438a23d982259461fe22bc1f46 (patch)
tree37efb94c71802ac8aa9ebf4c443b63aefc809479 /net
parent602bd0e90e14c0b50246b361290dbbbe551ada98 (diff)
net: switch importing msghdr from userland to {compat_,}import_iovec()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'net')
-rw-r--r--net/compat.c18
-rw-r--r--net/socket.c31
2 files changed, 19 insertions, 30 deletions
diff --git a/net/compat.c b/net/compat.c
index c4b6b0f43d5d..5cfd26a0006f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -31,10 +31,10 @@
31#include <asm/uaccess.h> 31#include <asm/uaccess.h>
32#include <net/compat.h> 32#include <net/compat.h>
33 33
34ssize_t get_compat_msghdr(struct msghdr *kmsg, 34int get_compat_msghdr(struct msghdr *kmsg,
35 struct compat_msghdr __user *umsg, 35 struct compat_msghdr __user *umsg,
36 struct sockaddr __user **save_addr, 36 struct sockaddr __user **save_addr,
37 struct iovec **iov) 37 struct iovec **iov)
38{ 38{
39 compat_uptr_t uaddr, uiov, tmp3; 39 compat_uptr_t uaddr, uiov, tmp3;
40 compat_size_t nr_segs; 40 compat_size_t nr_segs;
@@ -81,13 +81,9 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
81 81
82 kmsg->msg_iocb = NULL; 82 kmsg->msg_iocb = NULL;
83 83
84 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE, 84 return compat_import_iovec(save_addr ? READ : WRITE,
85 compat_ptr(uiov), nr_segs, 85 compat_ptr(uiov), nr_segs,
86 UIO_FASTIOV, *iov, iov); 86 UIO_FASTIOV, iov, &kmsg->msg_iter);
87 if (err >= 0)
88 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
89 *iov, nr_segs, err);
90 return err;
91} 87}
92 88
93/* Bleech... */ 89/* Bleech... */
diff --git a/net/socket.c b/net/socket.c
index 46f0e1d752b3..e5669cee0759 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1841,10 +1841,10 @@ struct used_address {
1841 unsigned int name_len; 1841 unsigned int name_len;
1842}; 1842};
1843 1843
1844static ssize_t copy_msghdr_from_user(struct msghdr *kmsg, 1844static int copy_msghdr_from_user(struct msghdr *kmsg,
1845 struct user_msghdr __user *umsg, 1845 struct user_msghdr __user *umsg,
1846 struct sockaddr __user **save_addr, 1846 struct sockaddr __user **save_addr,
1847 struct iovec **iov) 1847 struct iovec **iov)
1848{ 1848{
1849 struct sockaddr __user *uaddr; 1849 struct sockaddr __user *uaddr;
1850 struct iovec __user *uiov; 1850 struct iovec __user *uiov;
@@ -1890,13 +1890,8 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1890 1890
1891 kmsg->msg_iocb = NULL; 1891 kmsg->msg_iocb = NULL;
1892 1892
1893 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 1893 return import_iovec(save_addr ? READ : WRITE, uiov, nr_segs,
1894 uiov, nr_segs, 1894 UIO_FASTIOV, iov, &kmsg->msg_iter);
1895 UIO_FASTIOV, *iov, iov);
1896 if (err >= 0)
1897 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
1898 *iov, nr_segs, err);
1899 return err;
1900} 1895}
1901 1896
1902static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg, 1897static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
@@ -1921,8 +1916,8 @@ static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
1921 else 1916 else
1922 err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov); 1917 err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov);
1923 if (err < 0) 1918 if (err < 0)
1924 goto out_freeiov; 1919 return err;
1925 total_len = err; 1920 total_len = iov_iter_count(&msg_sys->msg_iter);
1926 1921
1927 err = -ENOBUFS; 1922 err = -ENOBUFS;
1928 1923
@@ -1988,8 +1983,7 @@ out_freectl:
1988 if (ctl_buf != ctl) 1983 if (ctl_buf != ctl)
1989 sock_kfree_s(sock->sk, ctl_buf, ctl_len); 1984 sock_kfree_s(sock->sk, ctl_buf, ctl_len);
1990out_freeiov: 1985out_freeiov:
1991 if (iov != iovstack) 1986 kfree(iov);
1992 kfree(iov);
1993 return err; 1987 return err;
1994} 1988}
1995 1989
@@ -2114,8 +2108,8 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2114 else 2108 else
2115 err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov); 2109 err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov);
2116 if (err < 0) 2110 if (err < 0)
2117 goto out_freeiov; 2111 return err;
2118 total_len = err; 2112 total_len = iov_iter_count(&msg_sys->msg_iter);
2119 2113
2120 cmsg_ptr = (unsigned long)msg_sys->msg_control; 2114 cmsg_ptr = (unsigned long)msg_sys->msg_control;
2121 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); 2115 msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
@@ -2153,8 +2147,7 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
2153 err = len; 2147 err = len;
2154 2148
2155out_freeiov: 2149out_freeiov:
2156 if (iov != iovstack) 2150 kfree(iov);
2157 kfree(iov);
2158 return err; 2151 return err;
2159} 2152}
2160 2153