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>
このコミットが含まれているのは:
@@ -627,14 +627,14 @@ static int j1939_sk_release(struct socket *sock)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int j1939_sk_setsockopt_flag(struct j1939_sock *jsk, char __user *optval,
|
||||
static int j1939_sk_setsockopt_flag(struct j1939_sock *jsk, sockptr_t optval,
|
||||
unsigned int optlen, int flag)
|
||||
{
|
||||
int tmp;
|
||||
|
||||
if (optlen != sizeof(tmp))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&tmp, optval, optlen))
|
||||
if (copy_from_sockptr(&tmp, optval, optlen))
|
||||
return -EFAULT;
|
||||
lock_sock(&jsk->sk);
|
||||
if (tmp)
|
||||
@@ -646,7 +646,7 @@ static int j1939_sk_setsockopt_flag(struct j1939_sock *jsk, char __user *optval,
|
||||
}
|
||||
|
||||
static int j1939_sk_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct j1939_sock *jsk = j1939_sk(sk);
|
||||
@@ -658,7 +658,7 @@ static int j1939_sk_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
switch (optname) {
|
||||
case SO_J1939_FILTER:
|
||||
if (optval) {
|
||||
if (!sockptr_is_null(optval)) {
|
||||
struct j1939_filter *f;
|
||||
int c;
|
||||
|
||||
@@ -670,7 +670,7 @@ static int j1939_sk_setsockopt(struct socket *sock, int level, int optname,
|
||||
return -EINVAL;
|
||||
|
||||
count = optlen / sizeof(*filters);
|
||||
filters = memdup_user(optval, optlen);
|
||||
filters = memdup_sockptr(optval, optlen);
|
||||
if (IS_ERR(filters))
|
||||
return PTR_ERR(filters);
|
||||
|
||||
@@ -703,7 +703,7 @@ static int j1939_sk_setsockopt(struct socket *sock, int level, int optname,
|
||||
case SO_J1939_SEND_PRIO:
|
||||
if (optlen != sizeof(tmp))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&tmp, optval, optlen))
|
||||
if (copy_from_sockptr(&tmp, optval, optlen))
|
||||
return -EFAULT;
|
||||
if (tmp < 0 || tmp > 7)
|
||||
return -EDOM;
|
||||
|
@@ -485,7 +485,7 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||
}
|
||||
|
||||
static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct raw_sock *ro = raw_sk(sk);
|
||||
@@ -511,11 +511,11 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
if (count > 1) {
|
||||
/* filter does not fit into dfilter => alloc space */
|
||||
filter = memdup_user(optval, optlen);
|
||||
filter = memdup_sockptr(optval, optlen);
|
||||
if (IS_ERR(filter))
|
||||
return PTR_ERR(filter);
|
||||
} else if (count == 1) {
|
||||
if (copy_from_user(&sfilter, optval, sizeof(sfilter)))
|
||||
if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -568,7 +568,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen != sizeof(err_mask))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&err_mask, optval, optlen))
|
||||
if (copy_from_sockptr(&err_mask, optval, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
err_mask &= CAN_ERR_MASK;
|
||||
@@ -607,7 +607,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen != sizeof(ro->loopback))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&ro->loopback, optval, optlen))
|
||||
if (copy_from_sockptr(&ro->loopback, optval, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
break;
|
||||
@@ -616,7 +616,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen != sizeof(ro->recv_own_msgs))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&ro->recv_own_msgs, optval, optlen))
|
||||
if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
break;
|
||||
@@ -625,7 +625,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen != sizeof(ro->fd_frames))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&ro->fd_frames, optval, optlen))
|
||||
if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
break;
|
||||
@@ -634,7 +634,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen != sizeof(ro->join_filters))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&ro->join_filters, optval, optlen))
|
||||
if (copy_from_sockptr(&ro->join_filters, optval, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
break;
|
||||
|
新しいイシューから参照
ユーザーをブロックする