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: Christoph Hellwig <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
d4c19c4914
commit
d38d2b00ba
@@ -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
|
|||||||
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
|
|||||||
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);
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
#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,
|
|||||||
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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user