forked from luck/tmp_suning_uos_patched
net/ipv6: switch ip6_mroute_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 <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
89654c5fcd
commit
b43c615313
|
@ -8,6 +8,7 @@
|
||||||
#include <net/net_namespace.h>
|
#include <net/net_namespace.h>
|
||||||
#include <uapi/linux/mroute6.h>
|
#include <uapi/linux/mroute6.h>
|
||||||
#include <linux/mroute_base.h>
|
#include <linux/mroute_base.h>
|
||||||
|
#include <linux/sockptr.h>
|
||||||
#include <net/fib_rules.h>
|
#include <net/fib_rules.h>
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MROUTE
|
#ifdef CONFIG_IPV6_MROUTE
|
||||||
|
@ -25,7 +26,7 @@ static inline int ip6_mroute_opt(int opt)
|
||||||
struct sock;
|
struct sock;
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MROUTE
|
#ifdef CONFIG_IPV6_MROUTE
|
||||||
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int);
|
extern int ip6_mroute_setsockopt(struct sock *, int, sockptr_t, unsigned int);
|
||||||
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||||
extern int ip6_mr_input(struct sk_buff *skb);
|
extern int ip6_mr_input(struct sk_buff *skb);
|
||||||
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||||
|
@ -33,9 +34,8 @@ extern int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *ar
|
||||||
extern int ip6_mr_init(void);
|
extern int ip6_mr_init(void);
|
||||||
extern void ip6_mr_cleanup(void);
|
extern void ip6_mr_cleanup(void);
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline int ip6_mroute_setsockopt(struct sock *sock, int optname,
|
||||||
int ip6_mroute_setsockopt(struct sock *sock,
|
sockptr_t optval, unsigned int optlen)
|
||||||
int optname, char __user *optval, unsigned int optlen)
|
|
||||||
{
|
{
|
||||||
return -ENOPROTOOPT;
|
return -ENOPROTOOPT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1629,7 +1629,8 @@ EXPORT_SYMBOL(mroute6_is_socket);
|
||||||
* MOSPF/PIM router set up we can clean this up.
|
* MOSPF/PIM router set up we can clean this up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsigned int optlen)
|
int ip6_mroute_setsockopt(struct sock *sk, int optname, sockptr_t optval,
|
||||||
|
unsigned int optlen)
|
||||||
{
|
{
|
||||||
int ret, parent = 0;
|
int ret, parent = 0;
|
||||||
struct mif6ctl vif;
|
struct mif6ctl vif;
|
||||||
|
@ -1665,7 +1666,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
case MRT6_ADD_MIF:
|
case MRT6_ADD_MIF:
|
||||||
if (optlen < sizeof(vif))
|
if (optlen < sizeof(vif))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (copy_from_user(&vif, optval, sizeof(vif)))
|
if (copy_from_sockptr(&vif, optval, sizeof(vif)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (vif.mif6c_mifi >= MAXMIFS)
|
if (vif.mif6c_mifi >= MAXMIFS)
|
||||||
return -ENFILE;
|
return -ENFILE;
|
||||||
|
@ -1678,7 +1679,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
case MRT6_DEL_MIF:
|
case MRT6_DEL_MIF:
|
||||||
if (optlen < sizeof(mifi_t))
|
if (optlen < sizeof(mifi_t))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (copy_from_user(&mifi, optval, sizeof(mifi_t)))
|
if (copy_from_sockptr(&mifi, optval, sizeof(mifi_t)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
ret = mif6_delete(mrt, mifi, 0, NULL);
|
ret = mif6_delete(mrt, mifi, 0, NULL);
|
||||||
|
@ -1697,7 +1698,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
case MRT6_DEL_MFC_PROXY:
|
case MRT6_DEL_MFC_PROXY:
|
||||||
if (optlen < sizeof(mfc))
|
if (optlen < sizeof(mfc))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (copy_from_user(&mfc, optval, sizeof(mfc)))
|
if (copy_from_sockptr(&mfc, optval, sizeof(mfc)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (parent == 0)
|
if (parent == 0)
|
||||||
parent = mfc.mf6cc_parent;
|
parent = mfc.mf6cc_parent;
|
||||||
|
@ -1718,7 +1719,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
|
|
||||||
if (optlen != sizeof(flags))
|
if (optlen != sizeof(flags))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(flags, (int __user *)optval))
|
if (copy_from_sockptr(&flags, optval, sizeof(flags)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
mroute_clean_tables(mrt, flags);
|
mroute_clean_tables(mrt, flags);
|
||||||
|
@ -1735,7 +1736,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
|
|
||||||
if (optlen != sizeof(v))
|
if (optlen != sizeof(v))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(v, (int __user *)optval))
|
if (copy_from_sockptr(&v, optval, sizeof(v)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mrt->mroute_do_assert = v;
|
mrt->mroute_do_assert = v;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1748,7 +1749,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
|
|
||||||
if (optlen != sizeof(v))
|
if (optlen != sizeof(v))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(v, (int __user *)optval))
|
if (copy_from_sockptr(&v, optval, sizeof(v)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
v = !!v;
|
v = !!v;
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
@ -1769,7 +1770,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
|
||||||
|
|
||||||
if (optlen != sizeof(u32))
|
if (optlen != sizeof(u32))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(v, (u32 __user *)optval))
|
if (copy_from_sockptr(&v, optval, sizeof(v)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
/* "pim6reg%u" should not exceed 16 bytes (IFNAMSIZ) */
|
/* "pim6reg%u" should not exceed 16 bytes (IFNAMSIZ) */
|
||||||
if (v != RT_TABLE_DEFAULT && v >= 100000000)
|
if (v != RT_TABLE_DEFAULT && v >= 100000000)
|
||||||
|
|
|
@ -337,7 +337,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||||
valbool = (val != 0);
|
valbool = (val != 0);
|
||||||
|
|
||||||
if (ip6_mroute_opt(optname))
|
if (ip6_mroute_opt(optname))
|
||||||
return ip6_mroute_setsockopt(sk, optname, optval, optlen);
|
return ip6_mroute_setsockopt(sk, optname, USER_SOCKPTR(optval),
|
||||||
|
optlen);
|
||||||
|
|
||||||
if (needs_rtnl)
|
if (needs_rtnl)
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user