@@ -136,37 +136,37 @@ static bool setsockopt_needs_rtnl(int optname)
136
136
return false;
137
137
}
138
138
139
- static int copy_group_source_from_user (struct group_source_req * greqs ,
140
- void __user * optval , int optlen )
139
+ static int copy_group_source_from_sockptr (struct group_source_req * greqs ,
140
+ sockptr_t optval , int optlen )
141
141
{
142
142
if (in_compat_syscall ()) {
143
143
struct compat_group_source_req gr32 ;
144
144
145
145
if (optlen < sizeof (gr32 ))
146
146
return - EINVAL ;
147
- if (copy_from_user (& gr32 , optval , sizeof (gr32 )))
147
+ if (copy_from_sockptr (& gr32 , optval , sizeof (gr32 )))
148
148
return - EFAULT ;
149
149
greqs -> gsr_interface = gr32 .gsr_interface ;
150
150
greqs -> gsr_group = gr32 .gsr_group ;
151
151
greqs -> gsr_source = gr32 .gsr_source ;
152
152
} else {
153
153
if (optlen < sizeof (* greqs ))
154
154
return - EINVAL ;
155
- if (copy_from_user (greqs , optval , sizeof (* greqs )))
155
+ if (copy_from_sockptr (greqs , optval , sizeof (* greqs )))
156
156
return - EFAULT ;
157
157
}
158
158
159
159
return 0 ;
160
160
}
161
161
162
162
static int do_ipv6_mcast_group_source (struct sock * sk , int optname ,
163
- void __user * optval , int optlen )
163
+ sockptr_t optval , int optlen )
164
164
{
165
165
struct group_source_req greqs ;
166
166
int omode , add ;
167
167
int ret ;
168
168
169
- ret = copy_group_source_from_user (& greqs , optval , optlen );
169
+ ret = copy_group_source_from_sockptr (& greqs , optval , optlen );
170
170
if (ret )
171
171
return ret ;
172
172
@@ -200,7 +200,7 @@ static int do_ipv6_mcast_group_source(struct sock *sk, int optname,
200
200
return ip6_mc_source (add , omode , sk , & greqs );
201
201
}
202
202
203
- static int ipv6_set_mcast_msfilter (struct sock * sk , void __user * optval ,
203
+ static int ipv6_set_mcast_msfilter (struct sock * sk , sockptr_t optval ,
204
204
int optlen )
205
205
{
206
206
struct group_filter * gsf ;
@@ -211,7 +211,7 @@ static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
211
211
if (optlen > sysctl_optmem_max )
212
212
return - ENOBUFS ;
213
213
214
- gsf = memdup_user (optval , optlen );
214
+ gsf = memdup_sockptr (optval , optlen );
215
215
if (IS_ERR (gsf ))
216
216
return PTR_ERR (gsf );
217
217
@@ -231,7 +231,7 @@ static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
231
231
return ret ;
232
232
}
233
233
234
- static int compat_ipv6_set_mcast_msfilter (struct sock * sk , void __user * optval ,
234
+ static int compat_ipv6_set_mcast_msfilter (struct sock * sk , sockptr_t optval ,
235
235
int optlen )
236
236
{
237
237
const int size0 = offsetof(struct compat_group_filter , gf_slist );
@@ -251,7 +251,7 @@ static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
251
251
252
252
gf32 = p + 4 ; /* we want ->gf_group and ->gf_slist aligned */
253
253
ret = - EFAULT ;
254
- if (copy_from_user (gf32 , optval , optlen ))
254
+ if (copy_from_sockptr (gf32 , optval , optlen ))
255
255
goto out_free_p ;
256
256
257
257
/* numsrc >= (4G-140)/128 overflow in 32 bits */
@@ -276,14 +276,14 @@ static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
276
276
}
277
277
278
278
static int ipv6_mcast_join_leave (struct sock * sk , int optname ,
279
- void __user * optval , int optlen )
279
+ sockptr_t optval , int optlen )
280
280
{
281
281
struct sockaddr_in6 * psin6 ;
282
282
struct group_req greq ;
283
283
284
284
if (optlen < sizeof (greq ))
285
285
return - EINVAL ;
286
- if (copy_from_user (& greq , optval , sizeof (greq )))
286
+ if (copy_from_sockptr (& greq , optval , sizeof (greq )))
287
287
return - EFAULT ;
288
288
289
289
if (greq .gr_group .ss_family != AF_INET6 )
@@ -296,14 +296,14 @@ static int ipv6_mcast_join_leave(struct sock *sk, int optname,
296
296
}
297
297
298
298
static int compat_ipv6_mcast_join_leave (struct sock * sk , int optname ,
299
- void __user * optval , int optlen )
299
+ sockptr_t optval , int optlen )
300
300
{
301
301
struct compat_group_req gr32 ;
302
302
struct sockaddr_in6 * psin6 ;
303
303
304
304
if (optlen < sizeof (gr32 ))
305
305
return - EINVAL ;
306
- if (copy_from_user (& gr32 , optval , sizeof (gr32 )))
306
+ if (copy_from_sockptr (& gr32 , optval , sizeof (gr32 )))
307
307
return - EFAULT ;
308
308
309
309
if (gr32 .gr_group .ss_family != AF_INET6 )
@@ -315,7 +315,7 @@ static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname,
315
315
return ipv6_sock_mc_drop (sk , gr32 .gr_interface , & psin6 -> sin6_addr );
316
316
}
317
317
318
- static int ipv6_set_opt_hdr (struct sock * sk , int optname , void __user * optval ,
318
+ static int ipv6_set_opt_hdr (struct sock * sk , int optname , sockptr_t optval ,
319
319
int optlen )
320
320
{
321
321
struct ipv6_pinfo * np = inet6_sk (sk );
@@ -332,14 +332,14 @@ static int ipv6_set_opt_hdr(struct sock *sk, int optname, void __user *optval,
332
332
* length, per RFC3542.
333
333
*/
334
334
if (optlen > 0 ) {
335
- if (! optval )
335
+ if (sockptr_is_null ( optval ) )
336
336
return - EINVAL ;
337
337
if (optlen < sizeof (struct ipv6_opt_hdr ) ||
338
338
optlen & 0x7 ||
339
339
optlen > 8 * 255 )
340
340
return - EINVAL ;
341
341
342
- new = memdup_user (optval , optlen );
342
+ new = memdup_sockptr (optval , optlen );
343
343
if (IS_ERR (new ))
344
344
return PTR_ERR (new );
345
345
if (unlikely (ipv6_optlen (new ) > optlen )) {
@@ -390,19 +390,19 @@ static int ipv6_set_opt_hdr(struct sock *sk, int optname, void __user *optval,
390
390
}
391
391
392
392
static int do_ipv6_setsockopt (struct sock * sk , int level , int optname ,
393
- char __user * optval , unsigned int optlen )
393
+ sockptr_t optval , unsigned int optlen )
394
394
{
395
395
struct ipv6_pinfo * np = inet6_sk (sk );
396
396
struct net * net = sock_net (sk );
397
397
int val , valbool ;
398
398
int retv = - ENOPROTOOPT ;
399
399
bool needs_rtnl = setsockopt_needs_rtnl (optname );
400
400
401
- if (! optval )
401
+ if (sockptr_is_null ( optval ) )
402
402
val = 0 ;
403
403
else {
404
404
if (optlen >= sizeof (int )) {
405
- if (get_user ( val , ( int __user * ) optval ))
405
+ if (copy_from_sockptr ( & val , optval , sizeof ( val ) ))
406
406
return - EFAULT ;
407
407
} else
408
408
val = 0 ;
@@ -411,8 +411,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
411
411
valbool = (val != 0 );
412
412
413
413
if (ip6_mroute_opt (optname ))
414
- return ip6_mroute_setsockopt (sk , optname , USER_SOCKPTR (optval ),
415
- optlen );
414
+ return ip6_mroute_setsockopt (sk , optname , optval , optlen );
416
415
417
416
if (needs_rtnl )
418
417
rtnl_lock ();
@@ -663,12 +662,13 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
663
662
664
663
if (optlen == 0 )
665
664
goto e_inval ;
666
- else if (optlen < sizeof (struct in6_pktinfo ) || !optval )
665
+ else if (optlen < sizeof (struct in6_pktinfo ) ||
666
+ sockptr_is_null (optval ))
667
667
goto e_inval ;
668
668
669
- if (copy_from_user (& pkt , optval , sizeof (struct in6_pktinfo ))) {
670
- retv = - EFAULT ;
671
- break ;
669
+ if (copy_from_sockptr (& pkt , optval , sizeof (pkt ))) {
670
+ retv = - EFAULT ;
671
+ break ;
672
672
}
673
673
if (!sk_dev_equal_l3scope (sk , pkt .ipi6_ifindex ))
674
674
goto e_inval ;
@@ -709,7 +709,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
709
709
refcount_set (& opt -> refcnt , 1 );
710
710
opt -> tot_len = sizeof (* opt ) + optlen ;
711
711
retv = - EFAULT ;
712
- if (copy_from_user (opt + 1 , optval , optlen ))
712
+ if (copy_from_sockptr (opt + 1 , optval , optlen ))
713
713
goto done ;
714
714
715
715
msg .msg_controllen = optlen ;
@@ -831,7 +831,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
831
831
break ;
832
832
833
833
retv = - EFAULT ;
834
- if (copy_from_user (& mreq , optval , sizeof (struct ipv6_mreq )))
834
+ if (copy_from_sockptr (& mreq , optval , sizeof (struct ipv6_mreq )))
835
835
break ;
836
836
837
837
if (optname == IPV6_ADD_MEMBERSHIP )
@@ -849,7 +849,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
849
849
goto e_inval ;
850
850
851
851
retv = - EFAULT ;
852
- if (copy_from_user (& mreq , optval , sizeof (struct ipv6_mreq )))
852
+ if (copy_from_sockptr (& mreq , optval , sizeof (struct ipv6_mreq )))
853
853
break ;
854
854
855
855
if (optname == IPV6_JOIN_ANYCAST )
@@ -929,15 +929,14 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
929
929
retv = 0 ;
930
930
break ;
931
931
case IPV6_FLOWLABEL_MGR :
932
- retv = ipv6_flowlabel_opt (sk , USER_SOCKPTR ( optval ) , optlen );
932
+ retv = ipv6_flowlabel_opt (sk , optval , optlen );
933
933
break ;
934
934
case IPV6_IPSEC_POLICY :
935
935
case IPV6_XFRM_POLICY :
936
936
retv = - EPERM ;
937
937
if (!ns_capable (net -> user_ns , CAP_NET_ADMIN ))
938
938
break ;
939
- retv = xfrm_user_policy (sk , optname , USER_SOCKPTR (optval ),
940
- optlen );
939
+ retv = xfrm_user_policy (sk , optname , optval , optlen );
941
940
break ;
942
941
943
942
case IPV6_ADDR_PREFERENCES :
@@ -992,7 +991,8 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
992
991
if (level != SOL_IPV6 )
993
992
return - ENOPROTOOPT ;
994
993
995
- err = do_ipv6_setsockopt (sk , level , optname , optval , optlen );
994
+ err = do_ipv6_setsockopt (sk , level , optname , USER_SOCKPTR (optval ),
995
+ optlen );
996
996
#ifdef CONFIG_NETFILTER
997
997
/* we need to exclude all possible ENOPROTOOPTs except default case */
998
998
if (err == - ENOPROTOOPT && optname != IPV6_IPSEC_POLICY &&
0 commit comments