ipv6_sockglue.c (67f4efdce7d85282fbd5832cddc80a07eb89b6d6) | ipv6_sockglue.c (af31f412c7c7a3c0fda4bf4beaf0c85af1f263c8) |
---|---|
1/* 2 * IPv6 BSD socket options interface 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/net/ipv4/ip_sockglue.c --- 329 unchanged lines hidden (view full) --- 338 case IPV6_RECVPATHMTU: 339 if (optlen < sizeof(int)) 340 goto e_inval; 341 np->rxopt.bits.rxpmtu = valbool; 342 retv = 0; 343 break; 344 345 case IPV6_TRANSPARENT: | 1/* 2 * IPv6 BSD socket options interface 3 * Linux INET6 implementation 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * Based on linux/net/ipv4/ip_sockglue.c --- 329 unchanged lines hidden (view full) --- 338 case IPV6_RECVPATHMTU: 339 if (optlen < sizeof(int)) 340 goto e_inval; 341 np->rxopt.bits.rxpmtu = valbool; 342 retv = 0; 343 break; 344 345 case IPV6_TRANSPARENT: |
346 if (valbool && !capable(CAP_NET_ADMIN) && !capable(CAP_NET_RAW)) { | 346 if (valbool && !ns_capable(net->user_ns, CAP_NET_ADMIN) && 347 !ns_capable(net->user_ns, CAP_NET_RAW)) { |
347 retv = -EPERM; 348 break; 349 } 350 if (optlen < sizeof(int)) 351 goto e_inval; 352 /* we don't have a separate transparent bit for IPV6 we use the one in the IPv4 socket */ 353 inet_sk(sk)->transparent = valbool; 354 retv = 0; --- 21 unchanged lines hidden (view full) --- 376 else if (optval == NULL) 377 goto e_inval; 378 else if (optlen < sizeof(struct ipv6_opt_hdr) || 379 optlen & 0x7 || optlen > 8 * 255) 380 goto e_inval; 381 382 /* hop-by-hop / destination options are privileged option */ 383 retv = -EPERM; | 348 retv = -EPERM; 349 break; 350 } 351 if (optlen < sizeof(int)) 352 goto e_inval; 353 /* we don't have a separate transparent bit for IPV6 we use the one in the IPv4 socket */ 354 inet_sk(sk)->transparent = valbool; 355 retv = 0; --- 21 unchanged lines hidden (view full) --- 377 else if (optval == NULL) 378 goto e_inval; 379 else if (optlen < sizeof(struct ipv6_opt_hdr) || 380 optlen & 0x7 || optlen > 8 * 255) 381 goto e_inval; 382 383 /* hop-by-hop / destination options are privileged option */ 384 retv = -EPERM; |
384 if (optname != IPV6_RTHDR && !capable(CAP_NET_RAW)) | 385 if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW)) |
385 break; 386 387 opt = ipv6_renew_options(sk, np->opt, optname, 388 (struct ipv6_opt_hdr __user *)optval, 389 optlen); 390 if (IS_ERR(opt)) { 391 retv = PTR_ERR(opt); 392 break; --- 356 unchanged lines hidden (view full) --- 749 retv = 0; 750 break; 751 case IPV6_FLOWLABEL_MGR: 752 retv = ipv6_flowlabel_opt(sk, optval, optlen); 753 break; 754 case IPV6_IPSEC_POLICY: 755 case IPV6_XFRM_POLICY: 756 retv = -EPERM; | 386 break; 387 388 opt = ipv6_renew_options(sk, np->opt, optname, 389 (struct ipv6_opt_hdr __user *)optval, 390 optlen); 391 if (IS_ERR(opt)) { 392 retv = PTR_ERR(opt); 393 break; --- 356 unchanged lines hidden (view full) --- 750 retv = 0; 751 break; 752 case IPV6_FLOWLABEL_MGR: 753 retv = ipv6_flowlabel_opt(sk, optval, optlen); 754 break; 755 case IPV6_IPSEC_POLICY: 756 case IPV6_XFRM_POLICY: 757 retv = -EPERM; |
757 if (!capable(CAP_NET_ADMIN)) | 758 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) |
758 break; 759 retv = xfrm_user_policy(sk, optname, optval, optlen); 760 break; 761 762 case IPV6_ADDR_PREFERENCES: 763 { 764 unsigned int pref = 0; 765 unsigned int prefmask = ~0; --- 561 unchanged lines hidden --- | 759 break; 760 retv = xfrm_user_policy(sk, optname, optval, optlen); 761 break; 762 763 case IPV6_ADDR_PREFERENCES: 764 { 765 unsigned int pref = 0; 766 unsigned int prefmask = ~0; --- 561 unchanged lines hidden --- |