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
@@ -1558,7 +1558,7 @@ static int fanout_set_data_cbpf(struct packet_sock *po, sockptr_t data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fanout_set_data_ebpf(struct packet_sock *po, char __user *data,
|
||||
static int fanout_set_data_ebpf(struct packet_sock *po, sockptr_t data,
|
||||
unsigned int len)
|
||||
{
|
||||
struct bpf_prog *new;
|
||||
@@ -1568,7 +1568,7 @@ static int fanout_set_data_ebpf(struct packet_sock *po, char __user *data,
|
||||
return -EPERM;
|
||||
if (len != sizeof(fd))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&fd, data, len))
|
||||
if (copy_from_sockptr(&fd, data, len))
|
||||
return -EFAULT;
|
||||
|
||||
new = bpf_prog_get_type(fd, BPF_PROG_TYPE_SOCKET_FILTER);
|
||||
@@ -1579,12 +1579,12 @@ static int fanout_set_data_ebpf(struct packet_sock *po, char __user *data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fanout_set_data(struct packet_sock *po, char __user *data,
|
||||
static int fanout_set_data(struct packet_sock *po, sockptr_t data,
|
||||
unsigned int len)
|
||||
{
|
||||
switch (po->fanout->type) {
|
||||
case PACKET_FANOUT_CBPF:
|
||||
return fanout_set_data_cbpf(po, USER_SOCKPTR(data), len);
|
||||
return fanout_set_data_cbpf(po, data, len);
|
||||
case PACKET_FANOUT_EBPF:
|
||||
return fanout_set_data_ebpf(po, data, len);
|
||||
default:
|
||||
@@ -3652,7 +3652,8 @@ static void packet_flush_mclist(struct sock *sk)
|
||||
}
|
||||
|
||||
static int
|
||||
packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
|
||||
packet_setsockopt(struct socket *sock, int level, int optname, sockptr_t optval,
|
||||
unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct packet_sock *po = pkt_sk(sk);
|
||||
@@ -3672,7 +3673,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
return -EINVAL;
|
||||
if (len > sizeof(mreq))
|
||||
len = sizeof(mreq);
|
||||
if (copy_from_user(&mreq, optval, len))
|
||||
if (copy_from_sockptr(&mreq, optval, len))
|
||||
return -EFAULT;
|
||||
if (len < (mreq.mr_alen + offsetof(struct packet_mreq, mr_address)))
|
||||
return -EINVAL;
|
||||
@@ -3703,7 +3704,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
if (optlen < len) {
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
if (copy_from_user(&req_u.req, optval, len))
|
||||
if (copy_from_sockptr(&req_u.req, optval, len))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
ret = packet_set_ring(sk, &req_u, 0,
|
||||
@@ -3718,7 +3719,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
pkt_sk(sk)->copy_thresh = val;
|
||||
@@ -3730,7 +3731,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
switch (val) {
|
||||
case TPACKET_V1:
|
||||
@@ -3756,7 +3757,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
if (val > INT_MAX)
|
||||
return -EINVAL;
|
||||
@@ -3776,7 +3777,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -3795,7 +3796,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen < sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -3809,7 +3810,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen < sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -3825,7 +3826,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
return -EINVAL;
|
||||
if (optlen < sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -3844,7 +3845,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
po->tp_tstamp = val;
|
||||
@@ -3856,7 +3857,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
return fanout_add(sk, val & 0xffff, val >> 16);
|
||||
@@ -3874,7 +3875,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
if (val < 0 || val > 1)
|
||||
return -EINVAL;
|
||||
@@ -3888,7 +3889,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -3907,7 +3908,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
|
||||
|
||||
if (optlen != sizeof(val))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
if (copy_from_sockptr(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
|
||||
|
Reference in New Issue
Block a user