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 ---