Commit 3021ad52 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David S. Miller

net/ipv6: remove compat_ipv6_{get,set}sockopt

Handle the few cases that need special treatment in-line using
in_compat_syscall().  This also removes all the now unused
compat_{get,set}sockopt methods.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fdf5bdd8
...@@ -48,14 +48,6 @@ struct inet_connection_sock_af_ops { ...@@ -48,14 +48,6 @@ struct inet_connection_sock_af_ops {
char __user *optval, unsigned int optlen); char __user *optval, unsigned int optlen);
int (*getsockopt)(struct sock *sk, int level, int optname, int (*getsockopt)(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
#ifdef CONFIG_COMPAT
int (*compat_setsockopt)(struct sock *sk,
int level, int optname,
char __user *optval, unsigned int optlen);
int (*compat_getsockopt)(struct sock *sk,
int level, int optname,
char __user *optval, int __user *optlen);
#endif
void (*addr2sockaddr)(struct sock *sk, struct sockaddr *); void (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
void (*mtu_reduced)(struct sock *sk); void (*mtu_reduced)(struct sock *sk);
}; };
...@@ -311,11 +303,6 @@ void inet_csk_listen_stop(struct sock *sk); ...@@ -311,11 +303,6 @@ void inet_csk_listen_stop(struct sock *sk);
void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr); void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu); struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu);
#define TCP_PINGPONG_THRESH 3 #define TCP_PINGPONG_THRESH 3
......
...@@ -1088,10 +1088,6 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -1088,10 +1088,6 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen); char __user *optval, unsigned int optlen);
int ipv6_getsockopt(struct sock *sk, int level, int optname, int ipv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
int addr_len); int addr_len);
......
...@@ -438,16 +438,6 @@ struct sctp_af { ...@@ -438,16 +438,6 @@ struct sctp_af {
int optname, int optname,
char __user *optval, char __user *optval,
int __user *optlen); int __user *optlen);
int (*compat_setsockopt) (struct sock *sk,
int level,
int optname,
char __user *optval,
unsigned int optlen);
int (*compat_getsockopt) (struct sock *sk,
int level,
int optname,
char __user *optval,
int __user *optlen);
void (*get_dst) (struct sctp_transport *t, void (*get_dst) (struct sctp_transport *t,
union sctp_addr *saddr, union sctp_addr *saddr,
struct flowi *fl, struct flowi *fl,
......
...@@ -1147,14 +1147,6 @@ struct proto { ...@@ -1147,14 +1147,6 @@ struct proto {
int __user *option); int __user *option);
void (*keepalive)(struct sock *sk, int valbool); void (*keepalive)(struct sock *sk, int valbool);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
int (*compat_setsockopt)(struct sock *sk,
int level,
int optname, char __user *optval,
unsigned int optlen);
int (*compat_getsockopt)(struct sock *sk,
int level,
int optname, char __user *optval,
int __user *option);
int (*compat_ioctl)(struct sock *sk, int (*compat_ioctl)(struct sock *sk,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
#endif #endif
......
...@@ -401,10 +401,6 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, ...@@ -401,10 +401,6 @@ int tcp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
int tcp_setsockopt(struct sock *sk, int level, int optname, int tcp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen); char __user *optval, unsigned int optlen);
int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
void tcp_set_keepalive(struct sock *sk, int val); void tcp_set_keepalive(struct sock *sk, int val);
void tcp_syn_ack_timeout(const struct request_sock *req); void tcp_syn_ack_timeout(const struct request_sock *req);
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
......
...@@ -3199,11 +3199,6 @@ int sock_common_getsockopt(struct socket *sock, int level, int optname, ...@@ -3199,11 +3199,6 @@ int sock_common_getsockopt(struct socket *sock, int level, int optname,
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
#ifdef CONFIG_COMPAT
if (in_compat_syscal() && sk->sk_prot->compat_getsockopt)
return sk->sk_prot->compat_getsockopt(sk, level, optname,
optval, optlen);
#endif
return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen); return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen);
} }
EXPORT_SYMBOL(sock_common_getsockopt); EXPORT_SYMBOL(sock_common_getsockopt);
...@@ -3231,11 +3226,6 @@ int sock_common_setsockopt(struct socket *sock, int level, int optname, ...@@ -3231,11 +3226,6 @@ int sock_common_setsockopt(struct socket *sock, int level, int optname,
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
#ifdef CONFIG_COMPAT
if (in_compat_syscall() && sk->sk_prot->compat_setsockopt)
return sk->sk_prot->compat_setsockopt(sk, level, optname,
optval, optlen);
#endif
return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen); return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen);
} }
EXPORT_SYMBOL(sock_common_setsockopt); EXPORT_SYMBOL(sock_common_setsockopt);
......
...@@ -296,12 +296,6 @@ int dccp_getsockopt(struct sock *sk, int level, int optname, ...@@ -296,12 +296,6 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
int dccp_setsockopt(struct sock *sk, int level, int optname, int dccp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen); char __user *optval, unsigned int optlen);
#ifdef CONFIG_COMPAT
int compat_dccp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
int compat_dccp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
#endif
int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg); int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg);
int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size); int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
......
...@@ -959,10 +959,6 @@ static struct proto dccp_v4_prot = { ...@@ -959,10 +959,6 @@ static struct proto dccp_v4_prot = {
.rsk_prot = &dccp_request_sock_ops, .rsk_prot = &dccp_request_sock_ops,
.twsk_prot = &dccp_timewait_sock_ops, .twsk_prot = &dccp_timewait_sock_ops,
.h.hashinfo = &dccp_hashinfo, .h.hashinfo = &dccp_hashinfo,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_dccp_setsockopt,
.compat_getsockopt = compat_dccp_getsockopt,
#endif
}; };
static const struct net_protocol dccp_v4_protocol = { static const struct net_protocol dccp_v4_protocol = {
......
...@@ -970,10 +970,6 @@ static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops = { ...@@ -970,10 +970,6 @@ static const struct inet_connection_sock_af_ops dccp_ipv6_af_ops = {
.getsockopt = ipv6_getsockopt, .getsockopt = ipv6_getsockopt,
.addr2sockaddr = inet6_csk_addr2sockaddr, .addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6), .sockaddr_len = sizeof(struct sockaddr_in6),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
}; };
/* /*
...@@ -990,10 +986,6 @@ static const struct inet_connection_sock_af_ops dccp_ipv6_mapped = { ...@@ -990,10 +986,6 @@ static const struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
.getsockopt = ipv6_getsockopt, .getsockopt = ipv6_getsockopt,
.addr2sockaddr = inet6_csk_addr2sockaddr, .addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6), .sockaddr_len = sizeof(struct sockaddr_in6),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
}; };
/* NOTE: A lot of things set to zero explicitly by call to /* NOTE: A lot of things set to zero explicitly by call to
...@@ -1049,10 +1041,6 @@ static struct proto dccp_v6_prot = { ...@@ -1049,10 +1041,6 @@ static struct proto dccp_v6_prot = {
.rsk_prot = &dccp6_request_sock_ops, .rsk_prot = &dccp6_request_sock_ops,
.twsk_prot = &dccp6_timewait_sock_ops, .twsk_prot = &dccp6_timewait_sock_ops,
.h.hashinfo = &dccp_hashinfo, .h.hashinfo = &dccp_hashinfo,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_dccp_setsockopt,
.compat_getsockopt = compat_dccp_getsockopt,
#endif
}; };
static const struct inet6_protocol dccp_v6_protocol = { static const struct inet6_protocol dccp_v6_protocol = {
......
...@@ -575,19 +575,6 @@ int dccp_setsockopt(struct sock *sk, int level, int optname, ...@@ -575,19 +575,6 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
EXPORT_SYMBOL_GPL(dccp_setsockopt); EXPORT_SYMBOL_GPL(dccp_setsockopt);
#ifdef CONFIG_COMPAT
int compat_dccp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
if (level != SOL_DCCP)
return inet_csk_compat_setsockopt(sk, level, optname,
optval, optlen);
return do_dccp_setsockopt(sk, level, optname, optval, optlen);
}
EXPORT_SYMBOL_GPL(compat_dccp_setsockopt);
#endif
static int dccp_getsockopt_service(struct sock *sk, int len, static int dccp_getsockopt_service(struct sock *sk, int len,
__be32 __user *optval, __be32 __user *optval,
int __user *optlen) int __user *optlen)
...@@ -696,19 +683,6 @@ int dccp_getsockopt(struct sock *sk, int level, int optname, ...@@ -696,19 +683,6 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
EXPORT_SYMBOL_GPL(dccp_getsockopt); EXPORT_SYMBOL_GPL(dccp_getsockopt);
#ifdef CONFIG_COMPAT
int compat_dccp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
if (level != SOL_DCCP)
return inet_csk_compat_getsockopt(sk, level, optname,
optval, optlen);
return do_dccp_getsockopt(sk, level, optname, optval, optlen);
}
EXPORT_SYMBOL_GPL(compat_dccp_getsockopt);
#endif
static int dccp_msghdr_parse(struct msghdr *msg, struct sk_buff *skb) static int dccp_msghdr_parse(struct msghdr *msg, struct sk_buff *skb)
{ {
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
......
...@@ -1057,34 +1057,6 @@ void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr) ...@@ -1057,34 +1057,6 @@ void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr)
} }
EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr); EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr);
#ifdef CONFIG_COMPAT
int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
const struct inet_connection_sock *icsk = inet_csk(sk);
if (icsk->icsk_af_ops->compat_getsockopt)
return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname,
optval, optlen);
return icsk->icsk_af_ops->getsockopt(sk, level, optname,
optval, optlen);
}
EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt);
int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
const struct inet_connection_sock *icsk = inet_csk(sk);
if (icsk->icsk_af_ops->compat_setsockopt)
return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname,
optval, optlen);
return icsk->icsk_af_ops->setsockopt(sk, level, optname,
optval, optlen);
}
EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt);
#endif
static struct dst_entry *inet_csk_rebuild_route(struct sock *sk, struct flowi *fl) static struct dst_entry *inet_csk_rebuild_route(struct sock *sk, struct flowi *fl)
{ {
const struct inet_sock *inet = inet_sk(sk); const struct inet_sock *inet = inet_sk(sk);
......
...@@ -3337,18 +3337,6 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, ...@@ -3337,18 +3337,6 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
} }
EXPORT_SYMBOL(tcp_setsockopt); EXPORT_SYMBOL(tcp_setsockopt);
#ifdef CONFIG_COMPAT
int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
if (level != SOL_TCP)
return inet_csk_compat_setsockopt(sk, level, optname,
optval, optlen);
return do_tcp_setsockopt(sk, level, optname, optval, optlen);
}
EXPORT_SYMBOL(compat_tcp_setsockopt);
#endif
static void tcp_get_info_chrono_stats(const struct tcp_sock *tp, static void tcp_get_info_chrono_stats(const struct tcp_sock *tp,
struct tcp_info *info) struct tcp_info *info)
{ {
...@@ -3896,18 +3884,6 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, ...@@ -3896,18 +3884,6 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
} }
EXPORT_SYMBOL(tcp_getsockopt); EXPORT_SYMBOL(tcp_getsockopt);
#ifdef CONFIG_COMPAT
int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
if (level != SOL_TCP)
return inet_csk_compat_getsockopt(sk, level, optname,
optval, optlen);
return do_tcp_getsockopt(sk, level, optname, optval, optlen);
}
EXPORT_SYMBOL(compat_tcp_getsockopt);
#endif
#ifdef CONFIG_TCP_MD5SIG #ifdef CONFIG_TCP_MD5SIG
static DEFINE_PER_CPU(struct tcp_md5sig_pool, tcp_md5sig_pool); static DEFINE_PER_CPU(struct tcp_md5sig_pool, tcp_md5sig_pool);
static DEFINE_MUTEX(tcp_md5sig_mutex); static DEFINE_MUTEX(tcp_md5sig_mutex);
......
...@@ -2769,10 +2769,6 @@ struct proto tcp_prot = { ...@@ -2769,10 +2769,6 @@ struct proto tcp_prot = {
.rsk_prot = &tcp_request_sock_ops, .rsk_prot = &tcp_request_sock_ops,
.h.hashinfo = &tcp_hashinfo, .h.hashinfo = &tcp_hashinfo,
.no_autobind = true, .no_autobind = true,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_tcp_setsockopt,
.compat_getsockopt = compat_tcp_getsockopt,
#endif
.diag_destroy = tcp_abort, .diag_destroy = tcp_abort,
}; };
EXPORT_SYMBOL(tcp_prot); EXPORT_SYMBOL(tcp_prot);
......
...@@ -136,13 +136,42 @@ static bool setsockopt_needs_rtnl(int optname) ...@@ -136,13 +136,42 @@ static bool setsockopt_needs_rtnl(int optname)
return false; return false;
} }
static int copy_group_source_from_user(struct group_source_req *greqs,
void __user *optval, int optlen)
{
if (in_compat_syscall()) {
struct compat_group_source_req gr32;
if (optlen < sizeof(gr32))
return -EINVAL;
if (copy_from_user(&gr32, optval, sizeof(gr32)))
return -EFAULT;
greqs->gsr_interface = gr32.gsr_interface;
greqs->gsr_group = gr32.gsr_group;
greqs->gsr_source = gr32.gsr_source;
} else {
if (optlen < sizeof(*greqs))
return -EINVAL;
if (copy_from_user(greqs, optval, sizeof(*greqs)))
return -EFAULT;
}
return 0;
}
static int do_ipv6_mcast_group_source(struct sock *sk, int optname, static int do_ipv6_mcast_group_source(struct sock *sk, int optname,
struct group_source_req *greqs) void __user *optval, int optlen)
{ {
struct group_source_req greqs;
int omode, add; int omode, add;
int ret;
ret = copy_group_source_from_user(&greqs, optval, optlen);
if (ret)
return ret;
if (greqs->gsr_group.ss_family != AF_INET6 || if (greqs.gsr_group.ss_family != AF_INET6 ||
greqs->gsr_source.ss_family != AF_INET6) greqs.gsr_source.ss_family != AF_INET6)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
if (optname == MCAST_BLOCK_SOURCE) { if (optname == MCAST_BLOCK_SOURCE) {
...@@ -155,8 +184,8 @@ static int do_ipv6_mcast_group_source(struct sock *sk, int optname, ...@@ -155,8 +184,8 @@ static int do_ipv6_mcast_group_source(struct sock *sk, int optname,
struct sockaddr_in6 *psin6; struct sockaddr_in6 *psin6;
int retv; int retv;
psin6 = (struct sockaddr_in6 *)&greqs->gsr_group; psin6 = (struct sockaddr_in6 *)&greqs.gsr_group;
retv = ipv6_sock_mc_join_ssm(sk, greqs->gsr_interface, retv = ipv6_sock_mc_join_ssm(sk, greqs.gsr_interface,
&psin6->sin6_addr, &psin6->sin6_addr,
MCAST_INCLUDE); MCAST_INCLUDE);
/* prior join w/ different source is ok */ /* prior join w/ different source is ok */
...@@ -168,7 +197,7 @@ static int do_ipv6_mcast_group_source(struct sock *sk, int optname, ...@@ -168,7 +197,7 @@ static int do_ipv6_mcast_group_source(struct sock *sk, int optname,
omode = MCAST_INCLUDE; omode = MCAST_INCLUDE;
add = 0; add = 0;
} }
return ip6_mc_source(add, omode, sk, greqs); return ip6_mc_source(add, omode, sk, &greqs);
} }
static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
...@@ -202,7 +231,6 @@ static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, ...@@ -202,7 +231,6 @@ static int ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
return ret; return ret;
} }
#ifdef CONFIG_COMPAT
static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
int optlen) int optlen)
{ {
...@@ -236,21 +264,16 @@ static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval, ...@@ -236,21 +264,16 @@ static int compat_ipv6_set_mcast_msfilter(struct sock *sk, void __user *optval,
if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen) if (offsetof(struct compat_group_filter, gf_slist[n]) > optlen)
goto out_free_p; goto out_free_p;
rtnl_lock();
lock_sock(sk);
ret = ip6_mc_msfilter(sk, &(struct group_filter){ ret = ip6_mc_msfilter(sk, &(struct group_filter){
.gf_interface = gf32->gf_interface, .gf_interface = gf32->gf_interface,
.gf_group = gf32->gf_group, .gf_group = gf32->gf_group,
.gf_fmode = gf32->gf_fmode, .gf_fmode = gf32->gf_fmode,
.gf_numsrc = gf32->gf_numsrc}, gf32->gf_slist); .gf_numsrc = gf32->gf_numsrc}, gf32->gf_slist);
release_sock(sk);
rtnl_unlock();
out_free_p: out_free_p:
kfree(p); kfree(p);
return ret; return ret;
} }
#endif
static int ipv6_mcast_join_leave(struct sock *sk, int optname, static int ipv6_mcast_join_leave(struct sock *sk, int optname,
void __user *optval, int optlen) void __user *optval, int optlen)
...@@ -272,13 +295,11 @@ static int ipv6_mcast_join_leave(struct sock *sk, int optname, ...@@ -272,13 +295,11 @@ static int ipv6_mcast_join_leave(struct sock *sk, int optname,
return ipv6_sock_mc_drop(sk, greq.gr_interface, &psin6->sin6_addr); return ipv6_sock_mc_drop(sk, greq.gr_interface, &psin6->sin6_addr);
} }
#ifdef CONFIG_COMPAT
static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname, static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname,
void __user *optval, int optlen) void __user *optval, int optlen)
{ {
struct compat_group_req gr32; struct compat_group_req gr32;
struct sockaddr_in6 *psin6; struct sockaddr_in6 *psin6;
int err;
if (optlen < sizeof(gr32)) if (optlen < sizeof(gr32))
return -EINVAL; return -EINVAL;
...@@ -287,20 +308,12 @@ static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname, ...@@ -287,20 +308,12 @@ static int compat_ipv6_mcast_join_leave(struct sock *sk, int optname,
if (gr32.gr_group.ss_family != AF_INET6) if (gr32.gr_group.ss_family != AF_INET6)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
rtnl_lock();
lock_sock(sk);
psin6 = (struct sockaddr_in6 *)&gr32.gr_group; psin6 = (struct sockaddr_in6 *)&gr32.gr_group;
if (optname == MCAST_JOIN_GROUP) if (optname == MCAST_JOIN_GROUP)
err = ipv6_sock_mc_join(sk, gr32.gr_interface, return ipv6_sock_mc_join(sk, gr32.gr_interface,
&psin6->sin6_addr); &psin6->sin6_addr);
else return ipv6_sock_mc_drop(sk, gr32.gr_interface, &psin6->sin6_addr);
err = ipv6_sock_mc_drop(sk, gr32.gr_interface,
&psin6->sin6_addr);
release_sock(sk);
rtnl_unlock();
return err;
} }
#endif
static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen) char __user *optval, unsigned int optlen)
...@@ -853,25 +866,24 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -853,25 +866,24 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
case MCAST_JOIN_GROUP: case MCAST_JOIN_GROUP:
case MCAST_LEAVE_GROUP: case MCAST_LEAVE_GROUP:
retv = ipv6_mcast_join_leave(sk, optname, optval, optlen); if (in_compat_syscall())
retv = compat_ipv6_mcast_join_leave(sk, optname, optval,
optlen);
else
retv = ipv6_mcast_join_leave(sk, optname, optval,
optlen);
break; break;
case MCAST_JOIN_SOURCE_GROUP: case MCAST_JOIN_SOURCE_GROUP:
case MCAST_LEAVE_SOURCE_GROUP: case MCAST_LEAVE_SOURCE_GROUP:
case MCAST_BLOCK_SOURCE: case MCAST_BLOCK_SOURCE:
case MCAST_UNBLOCK_SOURCE: case MCAST_UNBLOCK_SOURCE:
{ retv = do_ipv6_mcast_group_source(sk, optname, optval, optlen);
struct group_source_req greqs;
if (optlen < sizeof(struct group_source_req))
goto e_inval;
if (copy_from_user(&greqs, optval, sizeof(greqs))) {
retv = -EFAULT;
break;
}
retv = do_ipv6_mcast_group_source(sk, optname, &greqs);
break; break;
}
case MCAST_MSFILTER: case MCAST_MSFILTER:
if (in_compat_syscall())
retv = compat_ipv6_set_mcast_msfilter(sk, optval,
optlen);
else
retv = ipv6_set_mcast_msfilter(sk, optval, optlen); retv = ipv6_set_mcast_msfilter(sk, optval, optlen);
break; break;
case IPV6_ROUTER_ALERT: case IPV6_ROUTER_ALERT:
...@@ -989,64 +1001,6 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -989,64 +1001,6 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
} }
EXPORT_SYMBOL(ipv6_setsockopt); EXPORT_SYMBOL(ipv6_setsockopt);
#ifdef CONFIG_COMPAT
int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
int err;
if (level == SOL_IP && sk->sk_type != SOCK_RAW)
return udp_prot.setsockopt(sk, level, optname, optval, optlen);
if (level != SOL_IPV6)
return -ENOPROTOOPT;
switch (optname) {
case MCAST_JOIN_GROUP:
case MCAST_LEAVE_GROUP:
return compat_ipv6_mcast_join_leave(sk, optname, optval,
optlen);
case MCAST_JOIN_SOURCE_GROUP:
case MCAST_LEAVE_SOURCE_GROUP:
case MCAST_BLOCK_SOURCE:
case MCAST_UNBLOCK_SOURCE:
{
struct compat_group_source_req __user *gsr32 = (void __user *)optval;
struct group_source_req greqs;
if (optlen < sizeof(struct compat_group_source_req))
return -EINVAL;
if (get_user(greqs.gsr_interface, &gsr32->gsr_interface) ||
copy_from_user(&greqs.gsr_group, &gsr32->gsr_group,
sizeof(greqs.gsr_group)) ||
copy_from_user(&greqs.gsr_source, &gsr32->gsr_source,
sizeof(greqs.gsr_source)))
return -EFAULT;
rtnl_lock();
lock_sock(sk);
err = do_ipv6_mcast_group_source(sk, optname, &greqs);
release_sock(sk);
rtnl_unlock();
return err;
}
case MCAST_MSFILTER:
return compat_ipv6_set_mcast_msfilter(sk, optval, optlen);
}
err = do_ipv6_setsockopt(sk, level, optname, optval, optlen);
#ifdef CONFIG_NETFILTER
/* we need to exclude all possible ENOPROTOOPTs except default case */
if (err == -ENOPROTOOPT && optname != IPV6_IPSEC_POLICY &&
optname != IPV6_XFRM_POLICY)
err = nf_setsockopt(sk, PF_INET6, optname, optval, optlen);
#endif
return err;
}
EXPORT_SYMBOL(compat_ipv6_setsockopt);
#endif
static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt, static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt,
int optname, char __user *optval, int len) int optname, char __user *optval, int len)
{ {
...@@ -1110,7 +1064,6 @@ static int ipv6_get_msfilter(struct sock *sk, void __user *optval, ...@@ -1110,7 +1064,6 @@ static int ipv6_get_msfilter(struct sock *sk, void __user *optval,
return err; return err;
} }
#ifdef CONFIG_COMPAT
static int compat_ipv6_get_msfilter(struct sock *sk, void __user *optval, static int compat_ipv6_get_msfilter(struct sock *sk, void __user *optval,
int __user *optlen) int __user *optlen)
{ {
...@@ -1150,7 +1103,6 @@ static int compat_ipv6_get_msfilter(struct sock *sk, void __user *optval, ...@@ -1150,7 +1103,6 @@ static int compat_ipv6_get_msfilter(struct sock *sk, void __user *optval,
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
#endif
static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen, unsigned int flags) char __user *optval, int __user *optlen, unsigned int flags)
...@@ -1175,6 +1127,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -1175,6 +1127,8 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
val = sk->sk_family; val = sk->sk_family;
break; break;
case MCAST_MSFILTER: case MCAST_MSFILTER:
if (in_compat_syscall())
return compat_ipv6_get_msfilter(sk, optval, optlen);
return ipv6_get_msfilter(sk, optval, optlen, len); return ipv6_get_msfilter(sk, optval, optlen, len);
case IPV6_2292PKTOPTIONS: case IPV6_2292PKTOPTIONS:
{ {
...@@ -1523,38 +1477,3 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -1523,38 +1477,3 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
return err; return err;
} }
EXPORT_SYMBOL(ipv6_getsockopt); EXPORT_SYMBOL(ipv6_getsockopt);
#ifdef CONFIG_COMPAT
int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
int err;
if (level == SOL_IP && sk->sk_type != SOCK_RAW)
return udp_prot.getsockopt(sk, level, optname, optval, optlen);
if (level != SOL_IPV6)
return -ENOPROTOOPT;
if (optname == MCAST_MSFILTER)
return compat_ipv6_get_msfilter(sk, optval, optlen);
err = do_ipv6_getsockopt(sk, level, optname, optval, optlen,
MSG_CMSG_COMPAT);
#ifdef CONFIG_NETFILTER
/* we need to exclude all possible ENOPROTOOPTs except default case */
if (err == -ENOPROTOOPT && optname != IPV6_2292PKTOPTIONS) {
int len;
if (get_user(len, optlen))
return -EFAULT;
err = nf_getsockopt(sk, PF_INET6, optname, optval, &len);
if (err >= 0)
err = put_user(len, optlen);
}
#endif
return err;
}
EXPORT_SYMBOL(compat_ipv6_getsockopt);
#endif
...@@ -1084,30 +1084,6 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -1084,30 +1084,6 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
return do_rawv6_setsockopt(sk, level, optname, optval, optlen); return do_rawv6_setsockopt(sk, level, optname, optval, optlen);
} }
#ifdef CONFIG_COMPAT
static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
switch (level) {
case SOL_RAW:
break;
case SOL_ICMPV6:
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
return -EOPNOTSUPP;
return rawv6_seticmpfilter(sk, level, optname, optval, optlen);
case SOL_IPV6:
if (optname == IPV6_CHECKSUM ||
optname == IPV6_HDRINCL)
break;
fallthrough;
default:
return compat_ipv6_setsockopt(sk, level, optname,
optval, optlen);
}
return do_rawv6_setsockopt(sk, level, optname, optval, optlen);
}
#endif
static int do_rawv6_getsockopt(struct sock *sk, int level, int optname, static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen) char __user *optval, int __user *optlen)
{ {
...@@ -1169,30 +1145,6 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -1169,30 +1145,6 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
return do_rawv6_getsockopt(sk, level, optname, optval, optlen); return do_rawv6_getsockopt(sk, level, optname, optval, optlen);
} }
#ifdef CONFIG_COMPAT
static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
switch (level) {
case SOL_RAW:
break;
case SOL_ICMPV6:
if (inet_sk(sk)->inet_num != IPPROTO_ICMPV6)
return -EOPNOTSUPP;
return rawv6_geticmpfilter(sk, level, optname, optval, optlen);
case SOL_IPV6:
if (optname == IPV6_CHECKSUM ||
optname == IPV6_HDRINCL)
break;
fallthrough;
default:
return compat_ipv6_getsockopt(sk, level, optname,
optval, optlen);
}
return do_rawv6_getsockopt(sk, level, optname, optval, optlen);
}
#endif
static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg) static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
{ {
switch (cmd) { switch (cmd) {
...@@ -1297,8 +1249,6 @@ struct proto rawv6_prot = { ...@@ -1297,8 +1249,6 @@ struct proto rawv6_prot = {
.usersize = sizeof_field(struct raw6_sock, filter), .usersize = sizeof_field(struct raw6_sock, filter),
.h.raw_hash = &raw_v6_hashinfo, .h.raw_hash = &raw_v6_hashinfo,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_setsockopt = compat_rawv6_setsockopt,
.compat_getsockopt = compat_rawv6_getsockopt,
.compat_ioctl = compat_rawv6_ioctl, .compat_ioctl = compat_rawv6_ioctl,
#endif #endif
.diag_destroy = raw_abort, .diag_destroy = raw_abort,
......
...@@ -1831,10 +1831,6 @@ const struct inet_connection_sock_af_ops ipv6_specific = { ...@@ -1831,10 +1831,6 @@ const struct inet_connection_sock_af_ops ipv6_specific = {
.getsockopt = ipv6_getsockopt, .getsockopt = ipv6_getsockopt,
.addr2sockaddr = inet6_csk_addr2sockaddr, .addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6), .sockaddr_len = sizeof(struct sockaddr_in6),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
.mtu_reduced = tcp_v6_mtu_reduced, .mtu_reduced = tcp_v6_mtu_reduced,
}; };
...@@ -1861,10 +1857,6 @@ static const struct inet_connection_sock_af_ops ipv6_mapped = { ...@@ -1861,10 +1857,6 @@ static const struct inet_connection_sock_af_ops ipv6_mapped = {
.getsockopt = ipv6_getsockopt, .getsockopt = ipv6_getsockopt,
.addr2sockaddr = inet6_csk_addr2sockaddr, .addr2sockaddr = inet6_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in6), .sockaddr_len = sizeof(struct sockaddr_in6),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
.mtu_reduced = tcp_v4_mtu_reduced, .mtu_reduced = tcp_v4_mtu_reduced,
}; };
...@@ -2122,10 +2114,6 @@ struct proto tcpv6_prot = { ...@@ -2122,10 +2114,6 @@ struct proto tcpv6_prot = {
.rsk_prot = &tcp6_request_sock_ops, .rsk_prot = &tcp6_request_sock_ops,
.h.hashinfo = &tcp_hashinfo, .h.hashinfo = &tcp_hashinfo,
.no_autobind = true, .no_autobind = true,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_tcp_setsockopt,
.compat_getsockopt = compat_tcp_getsockopt,
#endif
.diag_destroy = tcp_abort, .diag_destroy = tcp_abort,
}; };
EXPORT_SYMBOL_GPL(tcpv6_prot); EXPORT_SYMBOL_GPL(tcpv6_prot);
......
...@@ -1570,17 +1570,6 @@ int udpv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -1570,17 +1570,6 @@ int udpv6_setsockopt(struct sock *sk, int level, int optname,
return ipv6_setsockopt(sk, level, optname, optval, optlen); return ipv6_setsockopt(sk, level, optname, optval, optlen);
} }
#ifdef CONFIG_COMPAT
int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen)
{
if (level == SOL_UDP || level == SOL_UDPLITE)
return udp_lib_setsockopt(sk, level, optname, optval, optlen,
udp_v6_push_pending_frames);
return compat_ipv6_setsockopt(sk, level, optname, optval, optlen);
}
#endif
int udpv6_getsockopt(struct sock *sk, int level, int optname, int udpv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen) char __user *optval, int __user *optlen)
{ {
...@@ -1589,16 +1578,6 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -1589,16 +1578,6 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname,
return ipv6_getsockopt(sk, level, optname, optval, optlen); return ipv6_getsockopt(sk, level, optname, optval, optlen);
} }
#ifdef CONFIG_COMPAT
int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
if (level == SOL_UDP || level == SOL_UDPLITE)
return udp_lib_getsockopt(sk, level, optname, optval, optlen);
return compat_ipv6_getsockopt(sk, level, optname, optval, optlen);
}
#endif
/* thinking of making this const? Don't. /* thinking of making this const? Don't.
* early_demux can change based on sysctl. * early_demux can change based on sysctl.
*/ */
...@@ -1681,10 +1660,6 @@ struct proto udpv6_prot = { ...@@ -1681,10 +1660,6 @@ struct proto udpv6_prot = {
.sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min), .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min),
.obj_size = sizeof(struct udp6_sock), .obj_size = sizeof(struct udp6_sock),
.h.udp_table = &udp_table, .h.udp_table = &udp_table,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_udpv6_setsockopt,
.compat_getsockopt = compat_udpv6_getsockopt,
#endif
.diag_destroy = udp_abort, .diag_destroy = udp_abort,
}; };
......
...@@ -19,12 +19,6 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname, ...@@ -19,12 +19,6 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen); char __user *optval, int __user *optlen);
int udpv6_setsockopt(struct sock *sk, int level, int optname, int udpv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen); char __user *optval, unsigned int optlen);
#ifdef CONFIG_COMPAT
int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
char __user *optval, unsigned int optlen);
int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen);
#endif
int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
int flags, int *addr_len); int flags, int *addr_len);
......
...@@ -52,10 +52,6 @@ struct proto udplitev6_prot = { ...@@ -52,10 +52,6 @@ struct proto udplitev6_prot = {
.sysctl_mem = sysctl_udp_mem, .sysctl_mem = sysctl_udp_mem,
.obj_size = sizeof(struct udp6_sock), .obj_size = sizeof(struct udp6_sock),
.h.udp_table = &udplite_table, .h.udp_table = &udplite_table,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_udpv6_setsockopt,
.compat_getsockopt = compat_udpv6_getsockopt,
#endif
}; };
static struct inet_protosw udplite6_protosw = { static struct inet_protosw udplite6_protosw = {
......
...@@ -745,10 +745,6 @@ static struct proto l2tp_ip6_prot = { ...@@ -745,10 +745,6 @@ static struct proto l2tp_ip6_prot = {
.hash = l2tp_ip6_hash, .hash = l2tp_ip6_hash,
.unhash = l2tp_ip6_unhash, .unhash = l2tp_ip6_unhash,
.obj_size = sizeof(struct l2tp_ip6_sock), .obj_size = sizeof(struct l2tp_ip6_sock),
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
}; };
static const struct proto_ops l2tp_ip6_ops = { static const struct proto_ops l2tp_ip6_ops = {
......
...@@ -1087,10 +1087,6 @@ static struct sctp_af sctp_af_inet6 = { ...@@ -1087,10 +1087,6 @@ static struct sctp_af sctp_af_inet6 = {
.net_header_len = sizeof(struct ipv6hdr), .net_header_len = sizeof(struct ipv6hdr),
.sockaddr_len = sizeof(struct sockaddr_in6), .sockaddr_len = sizeof(struct sockaddr_in6),
.ip_options_len = sctp_v6_ip_options_len, .ip_options_len = sctp_v6_ip_options_len,
#ifdef CONFIG_COMPAT
.compat_setsockopt = compat_ipv6_setsockopt,
.compat_getsockopt = compat_ipv6_getsockopt,
#endif
}; };
static struct sctp_pf sctp_pf_inet6 = { static struct sctp_pf sctp_pf_inet6 = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment