diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-03-21 19:29:06 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-09 00:02:26 -0400 |
commit | da18428498fb24438a23d982259461fe22bc1f46 (patch) | |
tree | 37efb94c71802ac8aa9ebf4c443b63aefc809479 /net | |
parent | 602bd0e90e14c0b50246b361290dbbbe551ada98 (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.c | 18 | ||||
-rw-r--r-- | net/socket.c | 31 |
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 | ||
34 | ssize_t get_compat_msghdr(struct msghdr *kmsg, | 34 | int 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 | ||
1844 | static ssize_t copy_msghdr_from_user(struct msghdr *kmsg, | 1844 | static 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 | ||
1902 | static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg, | 1897 | static 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); |
1990 | out_freeiov: | 1985 | out_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 | ||
2155 | out_freeiov: | 2149 | out_freeiov: |
2156 | if (iov != iovstack) | 2150 | kfree(iov); |
2157 | kfree(iov); | ||
2158 | return err; | 2151 | return err; |
2159 | } | 2152 | } |
2160 | 2153 | ||