@@ -2764,7 +2764,7 @@ static inline bool tcp_can_repair_sock(const struct sock *sk)
2764
2764
(sk -> sk_state != TCP_LISTEN );
2765
2765
}
2766
2766
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 )
2768
2768
{
2769
2769
struct tcp_repair_window opt ;
2770
2770
@@ -2774,7 +2774,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l
2774
2774
if (len != sizeof (opt ))
2775
2775
return - EINVAL ;
2776
2776
2777
- if (copy_from_user (& opt , optbuf , sizeof (opt )))
2777
+ if (copy_from_sockptr (& opt , optbuf , sizeof (opt )))
2778
2778
return - EFAULT ;
2779
2779
2780
2780
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
2796
return 0 ;
2797
2797
}
2798
2798
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 )
2801
2801
{
2802
2802
struct tcp_sock * tp = tcp_sk (sk );
2803
2803
struct tcp_repair_opt opt ;
2804
2804
2805
2805
while (len >= sizeof (opt )) {
2806
- if (copy_from_user (& opt , optbuf , sizeof (opt )))
2806
+ if (copy_from_sockptr (& opt , optbuf , sizeof (opt )))
2807
2807
return - EFAULT ;
2808
2808
2809
- optbuf ++ ;
2809
+ sockptr_advance ( optbuf , sizeof ( opt )) ;
2810
2810
len -= sizeof (opt );
2811
2811
2812
2812
switch (opt .opt_code ) {
@@ -3020,8 +3020,8 @@ EXPORT_SYMBOL(tcp_sock_set_keepcnt);
3020
3020
/*
3021
3021
* Socket option code for TCP.
3022
3022
*/
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 )
3025
3025
{
3026
3026
struct tcp_sock * tp = tcp_sk (sk );
3027
3027
struct inet_connection_sock * icsk = inet_csk (sk );
@@ -3037,7 +3037,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3037
3037
if (optlen < 1 )
3038
3038
return - EINVAL ;
3039
3039
3040
- val = strncpy_from_user (name , optval ,
3040
+ val = strncpy_from_sockptr (name , optval ,
3041
3041
min_t (long , TCP_CA_NAME_MAX - 1 , optlen ));
3042
3042
if (val < 0 )
3043
3043
return - EFAULT ;
@@ -3056,7 +3056,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3056
3056
if (optlen < 1 )
3057
3057
return - EINVAL ;
3058
3058
3059
- val = strncpy_from_user (name , optval ,
3059
+ val = strncpy_from_sockptr (name , optval ,
3060
3060
min_t (long , TCP_ULP_NAME_MAX - 1 ,
3061
3061
optlen ));
3062
3062
if (val < 0 )
@@ -3079,7 +3079,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3079
3079
optlen != TCP_FASTOPEN_KEY_BUF_LENGTH )
3080
3080
return - EINVAL ;
3081
3081
3082
- if (copy_from_user (key , optval , optlen ))
3082
+ if (copy_from_sockptr (key , optval , optlen ))
3083
3083
return - EFAULT ;
3084
3084
3085
3085
if (optlen == TCP_FASTOPEN_KEY_BUF_LENGTH )
@@ -3095,7 +3095,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3095
3095
if (optlen < sizeof (int ))
3096
3096
return - EINVAL ;
3097
3097
3098
- if (get_user ( val , ( int __user * ) optval ))
3098
+ if (copy_from_sockptr ( & val , optval , sizeof ( val ) ))
3099
3099
return - EFAULT ;
3100
3100
3101
3101
lock_sock (sk );
@@ -3174,9 +3174,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3174
3174
if (!tp -> repair )
3175
3175
err = - EINVAL ;
3176
3176
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 );
3180
3178
else
3181
3179
err = - EPERM ;
3182
3180
break ;
@@ -3249,8 +3247,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
3249
3247
#ifdef CONFIG_TCP_MD5SIG
3250
3248
case TCP_MD5SIG :
3251
3249
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 );
3254
3251
break ;
3255
3252
#endif
3256
3253
case TCP_USER_TIMEOUT :
@@ -3334,7 +3331,8 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
3334
3331
if (level != SOL_TCP )
3335
3332
return icsk -> icsk_af_ops -> setsockopt (sk , level , optname ,
3336
3333
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 );
3338
3336
}
3339
3337
EXPORT_SYMBOL (tcp_setsockopt );
3340
3338
0 commit comments