net: pass a sockptr_t into ->setsockopt
Rework the remaining setsockopt code to pass a sockptr_t instead of a plain user pointer. This removes the last remaining set_fs(KERNEL_DS) outside of architecture specific code. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Stefan Schmidt <stefan@datenfreihafen.org> [ieee802154] Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
d38d2b00ba
commit
a7b75c5a8c
@@ -290,8 +290,7 @@ static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rds_cancel_sent_to(struct rds_sock *rs, char __user *optval,
|
||||
int len)
|
||||
static int rds_cancel_sent_to(struct rds_sock *rs, sockptr_t optval, int len)
|
||||
{
|
||||
struct sockaddr_in6 sin6;
|
||||
struct sockaddr_in sin;
|
||||
@@ -308,14 +307,15 @@ static int rds_cancel_sent_to(struct rds_sock *rs, char __user *optval,
|
||||
goto out;
|
||||
} else if (len < sizeof(struct sockaddr_in6)) {
|
||||
/* Assume IPv4 */
|
||||
if (copy_from_user(&sin, optval, sizeof(struct sockaddr_in))) {
|
||||
if (copy_from_sockptr(&sin, optval,
|
||||
sizeof(struct sockaddr_in))) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
ipv6_addr_set_v4mapped(sin.sin_addr.s_addr, &sin6.sin6_addr);
|
||||
sin6.sin6_port = sin.sin_port;
|
||||
} else {
|
||||
if (copy_from_user(&sin6, optval,
|
||||
if (copy_from_sockptr(&sin6, optval,
|
||||
sizeof(struct sockaddr_in6))) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
@@ -327,21 +327,20 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rds_set_bool_option(unsigned char *optvar, char __user *optval,
|
||||
static int rds_set_bool_option(unsigned char *optvar, sockptr_t optval,
|
||||
int optlen)
|
||||
{
|
||||
int value;
|
||||
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
if (get_user(value, (int __user *) optval))
|
||||
if (copy_from_sockptr(&value, optval, sizeof(int)))
|
||||
return -EFAULT;
|
||||
*optvar = !!value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rds_cong_monitor(struct rds_sock *rs, char __user *optval,
|
||||
int optlen)
|
||||
static int rds_cong_monitor(struct rds_sock *rs, sockptr_t optval, int optlen)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -358,8 +357,7 @@ static int rds_cong_monitor(struct rds_sock *rs, char __user *optval,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rds_set_transport(struct rds_sock *rs, char __user *optval,
|
||||
int optlen)
|
||||
static int rds_set_transport(struct rds_sock *rs, sockptr_t optval, int optlen)
|
||||
{
|
||||
int t_type;
|
||||
|
||||
@@ -369,7 +367,7 @@ static int rds_set_transport(struct rds_sock *rs, char __user *optval,
|
||||
if (optlen != sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&t_type, (int __user *)optval, sizeof(t_type)))
|
||||
if (copy_from_sockptr(&t_type, optval, sizeof(t_type)))
|
||||
return -EFAULT;
|
||||
|
||||
if (t_type < 0 || t_type >= RDS_TRANS_COUNT)
|
||||
@@ -380,7 +378,7 @@ static int rds_set_transport(struct rds_sock *rs, char __user *optval,
|
||||
return rs->rs_transport ? 0 : -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
static int rds_enable_recvtstamp(struct sock *sk, char __user *optval,
|
||||
static int rds_enable_recvtstamp(struct sock *sk, sockptr_t optval,
|
||||
int optlen, int optname)
|
||||
{
|
||||
int val, valbool;
|
||||
@@ -388,7 +386,7 @@ static int rds_enable_recvtstamp(struct sock *sk, char __user *optval,
|
||||
if (optlen != sizeof(int))
|
||||
return -EFAULT;
|
||||
|
||||
if (get_user(val, (int __user *)optval))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(int)))
|
||||
return -EFAULT;
|
||||
|
||||
valbool = val ? 1 : 0;
|
||||
@@ -404,7 +402,7 @@ static int rds_enable_recvtstamp(struct sock *sk, char __user *optval,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
|
||||
static int rds_recv_track_latency(struct rds_sock *rs, sockptr_t optval,
|
||||
int optlen)
|
||||
{
|
||||
struct rds_rx_trace_so trace;
|
||||
@@ -413,7 +411,7 @@ static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
|
||||
if (optlen != sizeof(struct rds_rx_trace_so))
|
||||
return -EFAULT;
|
||||
|
||||
if (copy_from_user(&trace, optval, sizeof(trace)))
|
||||
if (copy_from_sockptr(&trace, optval, sizeof(trace)))
|
||||
return -EFAULT;
|
||||
|
||||
if (trace.rx_traces > RDS_MSG_RX_DGRAM_TRACE_MAX)
|
||||
@@ -432,7 +430,7 @@ static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
|
||||
}
|
||||
|
||||
static int rds_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct rds_sock *rs = rds_sk_to_rs(sock->sk);
|
||||
int ret;
|
||||
|
@@ -353,21 +353,20 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
int rds_get_mr(struct rds_sock *rs, sockptr_t optval, int optlen)
|
||||
{
|
||||
struct rds_get_mr_args args;
|
||||
|
||||
if (optlen != sizeof(struct rds_get_mr_args))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&args, (struct rds_get_mr_args __user *)optval,
|
||||
sizeof(struct rds_get_mr_args)))
|
||||
if (copy_from_sockptr(&args, optval, sizeof(struct rds_get_mr_args)))
|
||||
return -EFAULT;
|
||||
|
||||
return __rds_rdma_map(rs, &args, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
int rds_get_mr_for_dest(struct rds_sock *rs, sockptr_t optval, int optlen)
|
||||
{
|
||||
struct rds_get_mr_for_dest_args args;
|
||||
struct rds_get_mr_args new_args;
|
||||
@@ -375,7 +374,7 @@ int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
if (optlen != sizeof(struct rds_get_mr_for_dest_args))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&args, (struct rds_get_mr_for_dest_args __user *)optval,
|
||||
if (copy_from_sockptr(&args, optval,
|
||||
sizeof(struct rds_get_mr_for_dest_args)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -394,7 +393,7 @@ int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
/*
|
||||
* Free the MR indicated by the given R_Key
|
||||
*/
|
||||
int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
int rds_free_mr(struct rds_sock *rs, sockptr_t optval, int optlen)
|
||||
{
|
||||
struct rds_free_mr_args args;
|
||||
struct rds_mr *mr;
|
||||
@@ -403,8 +402,7 @@ int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen)
|
||||
if (optlen != sizeof(struct rds_free_mr_args))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&args, (struct rds_free_mr_args __user *)optval,
|
||||
sizeof(struct rds_free_mr_args)))
|
||||
if (copy_from_sockptr(&args, optval, sizeof(struct rds_free_mr_args)))
|
||||
return -EFAULT;
|
||||
|
||||
/* Special case - a null cookie means flush all unused MRs */
|
||||
|
@@ -924,9 +924,9 @@ int rds_send_pong(struct rds_conn_path *cp, __be16 dport);
|
||||
|
||||
/* rdma.c */
|
||||
void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force);
|
||||
int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
||||
int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
|
||||
int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
|
||||
int rds_get_mr(struct rds_sock *rs, sockptr_t optval, int optlen);
|
||||
int rds_get_mr_for_dest(struct rds_sock *rs, sockptr_t optval, int optlen);
|
||||
int rds_free_mr(struct rds_sock *rs, sockptr_t optval, int optlen);
|
||||
void rds_rdma_drop_keys(struct rds_sock *rs);
|
||||
int rds_rdma_extra_size(struct rds_rdma_args *args,
|
||||
struct rds_iov_vector *iov);
|
||||
|
Reference in New Issue
Block a user