Commit d38d2b00 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David S. Miller

net/tcp: switch do_tcp_setsockopt to sockptr_t

Pass a sockptr_t to prepare for set_fs-less handling of the kernel
pointer from bpf-cgroup.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d4c19c49
...@@ -2764,7 +2764,7 @@ static inline bool tcp_can_repair_sock(const struct sock *sk) ...@@ -2764,7 +2764,7 @@ static inline bool tcp_can_repair_sock(const struct sock *sk)
(sk->sk_state != TCP_LISTEN); (sk->sk_state != TCP_LISTEN);
} }
static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int len) static int tcp_repair_set_window(struct tcp_sock *tp, sockptr_t optbuf, int len)
{ {
struct tcp_repair_window opt; struct tcp_repair_window opt;
...@@ -2774,7 +2774,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l ...@@ -2774,7 +2774,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
if (len != sizeof(opt)) if (len != sizeof(opt))
return -EINVAL; return -EINVAL;
if (copy_from_user(&opt, optbuf, sizeof(opt))) if (copy_from_sockptr(&opt, optbuf, sizeof(opt)))
return -EFAULT; return -EFAULT;
if (opt.max_window < opt.snd_wnd) if (opt.max_window < opt.snd_wnd)
...@@ -2796,17 +2796,17 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l ...@@ -2796,17 +2796,17 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
return 0; return 0;
} }
static int tcp_repair_options_est(struct sock *sk, static int tcp_repair_options_est(struct sock *sk, sockptr_t optbuf,
struct tcp_repair_opt __user *optbuf, unsigned int len) unsigned int len)
{ {
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
struct tcp_repair_opt opt; struct tcp_repair_opt opt;
while (len >= sizeof(opt)) { while (len >= sizeof(opt)) {
if (copy_from_user(&opt, optbuf, sizeof(opt))) if (copy_from_sockptr(&opt, optbuf, sizeof(opt)))
return -EFAULT; return -EFAULT;
optbuf++; sockptr_advance(optbuf, sizeof(opt));
len -= sizeof(opt); len -= sizeof(opt);
switch (opt.opt_code) { switch (opt.opt_code) {
...@@ -3020,8 +3020,8 @@ EXPORT_SYMBOL(tcp_sock_set_keepcnt); ...@@ -3020,8 +3020,8 @@ EXPORT_SYMBOL(tcp_sock_set_keepcnt);
/* /*
* Socket option code for TCP. * Socket option code for TCP.
*/ */
static int do_tcp_setsockopt(struct sock *sk, int level, static int do_tcp_setsockopt(struct sock *sk, int level, int optname,
int optname, char __user *optval, unsigned int optlen) sockptr_t optval, unsigned int optlen)
{ {
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
struct inet_connection_sock *icsk = inet_csk(sk); struct inet_connection_sock *icsk = inet_csk(sk);
...@@ -3037,7 +3037,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3037,7 +3037,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (optlen < 1) if (optlen < 1)
return -EINVAL; return -EINVAL;
val = strncpy_from_user(name, optval, val = strncpy_from_sockptr(name, optval,
min_t(long, TCP_CA_NAME_MAX-1, optlen)); min_t(long, TCP_CA_NAME_MAX-1, optlen));
if (val < 0) if (val < 0)
return -EFAULT; return -EFAULT;
...@@ -3056,7 +3056,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3056,7 +3056,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (optlen < 1) if (optlen < 1)
return -EINVAL; return -EINVAL;
val = strncpy_from_user(name, optval, val = strncpy_from_sockptr(name, optval,
min_t(long, TCP_ULP_NAME_MAX - 1, min_t(long, TCP_ULP_NAME_MAX - 1,
optlen)); optlen));
if (val < 0) if (val < 0)
...@@ -3079,7 +3079,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3079,7 +3079,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
optlen != TCP_FASTOPEN_KEY_BUF_LENGTH) optlen != TCP_FASTOPEN_KEY_BUF_LENGTH)
return -EINVAL; return -EINVAL;
if (copy_from_user(key, optval, optlen)) if (copy_from_sockptr(key, optval, optlen))
return -EFAULT; return -EFAULT;
if (optlen == TCP_FASTOPEN_KEY_BUF_LENGTH) if (optlen == TCP_FASTOPEN_KEY_BUF_LENGTH)
...@@ -3095,7 +3095,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3095,7 +3095,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (optlen < sizeof(int)) if (optlen < sizeof(int))
return -EINVAL; return -EINVAL;
if (get_user(val, (int __user *)optval)) if (copy_from_sockptr(&val, optval, sizeof(val)))
return -EFAULT; return -EFAULT;
lock_sock(sk); lock_sock(sk);
...@@ -3174,9 +3174,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3174,9 +3174,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
if (!tp->repair) if (!tp->repair)
err = -EINVAL; err = -EINVAL;
else if (sk->sk_state == TCP_ESTABLISHED) else if (sk->sk_state == TCP_ESTABLISHED)
err = tcp_repair_options_est(sk, err = tcp_repair_options_est(sk, optval, optlen);
(struct tcp_repair_opt __user *)optval,
optlen);
else else
err = -EPERM; err = -EPERM;
break; break;
...@@ -3249,8 +3247,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -3249,8 +3247,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
case TCP_MD5SIG: case TCP_MD5SIG:
case TCP_MD5SIG_EXT: case TCP_MD5SIG_EXT:
err = tp->af_specific->md5_parse(sk, optname, err = tp->af_specific->md5_parse(sk, optname, optval, optlen);
USER_SOCKPTR(optval), optlen);
break; break;
#endif #endif
case TCP_USER_TIMEOUT: case TCP_USER_TIMEOUT:
...@@ -3334,7 +3331,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, ...@@ -3334,7 +3331,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
if (level != SOL_TCP) if (level != SOL_TCP)
return icsk->icsk_af_ops->setsockopt(sk, level, optname, return icsk->icsk_af_ops->setsockopt(sk, level, optname,
optval, optlen); optval, optlen);
return do_tcp_setsockopt(sk, level, optname, optval, optlen); return do_tcp_setsockopt(sk, level, optname, USER_SOCKPTR(optval),
optlen);
} }
EXPORT_SYMBOL(tcp_setsockopt); EXPORT_SYMBOL(tcp_setsockopt);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment