Skip to content

Commit d38d2b0

Browse files
Christoph Hellwigdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d4c19c4 commit d38d2b0

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

net/ipv4/tcp.c

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2764,7 +2764,7 @@ static inline bool tcp_can_repair_sock(const struct sock *sk)
27642764
(sk->sk_state != TCP_LISTEN);
27652765
}
27662766

2767-
static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int len)
2767+
static int tcp_repair_set_window(struct tcp_sock *tp, sockptr_t optbuf, int len)
27682768
{
27692769
struct tcp_repair_window opt;
27702770

@@ -2774,7 +2774,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
27742774
if (len != sizeof(opt))
27752775
return -EINVAL;
27762776

2777-
if (copy_from_user(&opt, optbuf, sizeof(opt)))
2777+
if (copy_from_sockptr(&opt, optbuf, sizeof(opt)))
27782778
return -EFAULT;
27792779

27802780
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
27962796
return 0;
27972797
}
27982798

2799-
static int tcp_repair_options_est(struct sock *sk,
2800-
struct tcp_repair_opt __user *optbuf, unsigned int len)
2799+
static int tcp_repair_options_est(struct sock *sk, sockptr_t optbuf,
2800+
unsigned int len)
28012801
{
28022802
struct tcp_sock *tp = tcp_sk(sk);
28032803
struct tcp_repair_opt opt;
28042804

28052805
while (len >= sizeof(opt)) {
2806-
if (copy_from_user(&opt, optbuf, sizeof(opt)))
2806+
if (copy_from_sockptr(&opt, optbuf, sizeof(opt)))
28072807
return -EFAULT;
28082808

2809-
optbuf++;
2809+
sockptr_advance(optbuf, sizeof(opt));
28102810
len -= sizeof(opt);
28112811

28122812
switch (opt.opt_code) {
@@ -3020,8 +3020,8 @@ EXPORT_SYMBOL(tcp_sock_set_keepcnt);
30203020
/*
30213021
* Socket option code for TCP.
30223022
*/
3023-
static int do_tcp_setsockopt(struct sock *sk, int level,
3024-
int optname, char __user *optval, unsigned int optlen)
3023+
static int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3024+
sockptr_t optval, unsigned int optlen)
30253025
{
30263026
struct tcp_sock *tp = tcp_sk(sk);
30273027
struct inet_connection_sock *icsk = inet_csk(sk);
@@ -3037,7 +3037,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
30373037
if (optlen < 1)
30383038
return -EINVAL;
30393039

3040-
val = strncpy_from_user(name, optval,
3040+
val = strncpy_from_sockptr(name, optval,
30413041
min_t(long, TCP_CA_NAME_MAX-1, optlen));
30423042
if (val < 0)
30433043
return -EFAULT;
@@ -3056,7 +3056,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
30563056
if (optlen < 1)
30573057
return -EINVAL;
30583058

3059-
val = strncpy_from_user(name, optval,
3059+
val = strncpy_from_sockptr(name, optval,
30603060
min_t(long, TCP_ULP_NAME_MAX - 1,
30613061
optlen));
30623062
if (val < 0)
@@ -3079,7 +3079,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
30793079
optlen != TCP_FASTOPEN_KEY_BUF_LENGTH)
30803080
return -EINVAL;
30813081

3082-
if (copy_from_user(key, optval, optlen))
3082+
if (copy_from_sockptr(key, optval, optlen))
30833083
return -EFAULT;
30843084

30853085
if (optlen == TCP_FASTOPEN_KEY_BUF_LENGTH)
@@ -3095,7 +3095,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
30953095
if (optlen < sizeof(int))
30963096
return -EINVAL;
30973097

3098-
if (get_user(val, (int __user *)optval))
3098+
if (copy_from_sockptr(&val, optval, sizeof(val)))
30993099
return -EFAULT;
31003100

31013101
lock_sock(sk);
@@ -3174,9 +3174,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
31743174
if (!tp->repair)
31753175
err = -EINVAL;
31763176
else if (sk->sk_state == TCP_ESTABLISHED)
3177-
err = tcp_repair_options_est(sk,
3178-
(struct tcp_repair_opt __user *)optval,
3179-
optlen);
3177+
err = tcp_repair_options_est(sk, optval, optlen);
31803178
else
31813179
err = -EPERM;
31823180
break;
@@ -3249,8 +3247,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
32493247
#ifdef CONFIG_TCP_MD5SIG
32503248
case TCP_MD5SIG:
32513249
case TCP_MD5SIG_EXT:
3252-
err = tp->af_specific->md5_parse(sk, optname,
3253-
USER_SOCKPTR(optval), optlen);
3250+
err = tp->af_specific->md5_parse(sk, optname, optval, optlen);
32543251
break;
32553252
#endif
32563253
case TCP_USER_TIMEOUT:
@@ -3334,7 +3331,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
33343331
if (level != SOL_TCP)
33353332
return icsk->icsk_af_ops->setsockopt(sk, level, optname,
33363333
optval, optlen);
3337-
return do_tcp_setsockopt(sk, level, optname, optval, optlen);
3334+
return do_tcp_setsockopt(sk, level, optname, USER_SOCKPTR(optval),
3335+
optlen);
33383336
}
33393337
EXPORT_SYMBOL(tcp_setsockopt);
33403338

0 commit comments

Comments
 (0)