You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
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
@@ -197,8 +197,7 @@ unlock:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int alg_setkey(struct sock *sk, char __user *ukey,
|
||||
unsigned int keylen)
|
||||
static int alg_setkey(struct sock *sk, sockptr_t ukey, unsigned int keylen)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
const struct af_alg_type *type = ask->type;
|
||||
@@ -210,7 +209,7 @@ static int alg_setkey(struct sock *sk, char __user *ukey,
|
||||
return -ENOMEM;
|
||||
|
||||
err = -EFAULT;
|
||||
if (copy_from_user(key, ukey, keylen))
|
||||
if (copy_from_sockptr(key, ukey, keylen))
|
||||
goto out;
|
||||
|
||||
err = type->setkey(ask->private, key, keylen);
|
||||
@@ -222,7 +221,7 @@ out:
|
||||
}
|
||||
|
||||
static int alg_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 alg_sock *ask = alg_sk(sk);
|
||||
|
||||
@@ -488,7 +488,7 @@ static int chtls_getsockopt(struct sock *sk, int level, int optname,
|
||||
}
|
||||
|
||||
static int do_chtls_setsockopt(struct sock *sk, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct tls_crypto_info *crypto_info, tmp_crypto_info;
|
||||
struct chtls_sock *csk;
|
||||
@@ -498,12 +498,12 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
|
||||
|
||||
csk = rcu_dereference_sk_user_data(sk);
|
||||
|
||||
if (!optval || optlen < sizeof(*crypto_info)) {
|
||||
if (sockptr_is_null(optval) || optlen < sizeof(*crypto_info)) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = copy_from_user(&tmp_crypto_info, optval, sizeof(*crypto_info));
|
||||
rc = copy_from_sockptr(&tmp_crypto_info, optval, sizeof(*crypto_info));
|
||||
if (rc) {
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
@@ -525,8 +525,9 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
|
||||
/* Obtain version and type from previous copy */
|
||||
crypto_info[0] = tmp_crypto_info;
|
||||
/* Now copy the following data */
|
||||
rc = copy_from_user((char *)crypto_info + sizeof(*crypto_info),
|
||||
optval + sizeof(*crypto_info),
|
||||
sockptr_advance(optval, sizeof(*crypto_info));
|
||||
rc = copy_from_sockptr((char *)crypto_info + sizeof(*crypto_info),
|
||||
optval,
|
||||
sizeof(struct tls12_crypto_info_aes_gcm_128)
|
||||
- sizeof(*crypto_info));
|
||||
|
||||
@@ -541,8 +542,9 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
|
||||
}
|
||||
case TLS_CIPHER_AES_GCM_256: {
|
||||
crypto_info[0] = tmp_crypto_info;
|
||||
rc = copy_from_user((char *)crypto_info + sizeof(*crypto_info),
|
||||
optval + sizeof(*crypto_info),
|
||||
sockptr_advance(optval, sizeof(*crypto_info));
|
||||
rc = copy_from_sockptr((char *)crypto_info + sizeof(*crypto_info),
|
||||
optval,
|
||||
sizeof(struct tls12_crypto_info_aes_gcm_256)
|
||||
- sizeof(*crypto_info));
|
||||
|
||||
@@ -565,7 +567,7 @@ out:
|
||||
}
|
||||
|
||||
static int chtls_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct tls_context *ctx = tls_get_ctx(sk);
|
||||
|
||||
|
||||
@@ -401,7 +401,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
|
||||
static int data_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int len)
|
||||
sockptr_t optval, unsigned int len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
int err = 0, opt = 0;
|
||||
@@ -414,7 +414,7 @@ static int data_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
switch (optname) {
|
||||
case MISDN_TIME_STAMP:
|
||||
if (get_user(opt, (int __user *)optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(int))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/once.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/sockptr.h>
|
||||
|
||||
#include <uapi/linux/net.h>
|
||||
|
||||
@@ -162,7 +163,8 @@ struct proto_ops {
|
||||
int (*listen) (struct socket *sock, int len);
|
||||
int (*shutdown) (struct socket *sock, int flags);
|
||||
int (*setsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, unsigned int optlen);
|
||||
int optname, sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
int (*getsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int __user *optlen);
|
||||
void (*show_fdinfo)(struct seq_file *m, struct socket *sock);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sockptr.h>
|
||||
|
||||
#include <net/inet_sock.h>
|
||||
#include <net/request_sock.h>
|
||||
@@ -45,7 +46,7 @@ struct inet_connection_sock_af_ops {
|
||||
u16 net_frag_header_len;
|
||||
u16 sockaddr_len;
|
||||
int (*setsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
sockptr_t optval, unsigned int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
void (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
|
||||
|
||||
@@ -722,7 +722,7 @@ void ip_cmsg_recv_offset(struct msghdr *msg, struct sock *sk,
|
||||
struct sk_buff *skb, int tlen, int offset);
|
||||
int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
|
||||
struct ipcm_cookie *ipc, bool allow_ipv6);
|
||||
int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
||||
int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
||||
int __user *optlen);
|
||||
|
||||
@@ -1084,8 +1084,8 @@ struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
|
||||
* socket options (ipv6_sockglue.c)
|
||||
*/
|
||||
|
||||
int ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
int ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
int ipv6_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
|
||||
|
||||
@@ -431,7 +431,7 @@ struct sctp_af {
|
||||
int (*setsockopt) (struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
int (*getsockopt) (struct sock *sk,
|
||||
int level,
|
||||
|
||||
@@ -1141,7 +1141,7 @@ struct proto {
|
||||
void (*destroy)(struct sock *sk);
|
||||
void (*shutdown)(struct sock *sk, int how);
|
||||
int (*setsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
int optname, sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
@@ -1734,7 +1734,7 @@ int sock_common_getsockopt(struct socket *sock, int level, int optname,
|
||||
int sock_common_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||
int flags);
|
||||
int sock_common_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
sockptr_t optval, unsigned int optlen);
|
||||
|
||||
void sk_common_release(struct sock *sk);
|
||||
|
||||
|
||||
@@ -399,8 +399,8 @@ __poll_t tcp_poll(struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
int tcp_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
int tcp_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
int tcp_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
||||
unsigned int optlen);
|
||||
void tcp_set_keepalive(struct sock *sk, int val);
|
||||
void tcp_syn_ack_timeout(const struct request_sock *req);
|
||||
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
||||
|
||||
@@ -745,7 +745,7 @@ static int check_qos(const struct atm_qos *qos)
|
||||
}
|
||||
|
||||
int vcc_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct atm_vcc *vcc;
|
||||
unsigned long value;
|
||||
@@ -760,7 +760,7 @@ int vcc_setsockopt(struct socket *sock, int level, int optname,
|
||||
{
|
||||
struct atm_qos qos;
|
||||
|
||||
if (copy_from_user(&qos, optval, sizeof(qos)))
|
||||
if (copy_from_sockptr(&qos, optval, sizeof(qos)))
|
||||
return -EFAULT;
|
||||
error = check_qos(&qos);
|
||||
if (error)
|
||||
@@ -774,7 +774,7 @@ int vcc_setsockopt(struct socket *sock, int level, int optname,
|
||||
return 0;
|
||||
}
|
||||
case SO_SETCLP:
|
||||
if (get_user(value, (unsigned long __user *)optval))
|
||||
if (copy_from_sockptr(&value, optval, sizeof(value)))
|
||||
return -EFAULT;
|
||||
if (value)
|
||||
vcc->atm_options |= ATM_ATMOPT_CLP;
|
||||
|
||||
@@ -21,7 +21,7 @@ __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
|
||||
int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
||||
int vcc_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
sockptr_t optval, unsigned int optlen);
|
||||
int vcc_getsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
void vcc_process_recv_queue(struct atm_vcc *vcc);
|
||||
|
||||
@@ -63,7 +63,7 @@ static int pvc_connect(struct socket *sock, struct sockaddr *sockaddr,
|
||||
}
|
||||
|
||||
static int pvc_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;
|
||||
int error;
|
||||
|
||||
@@ -451,7 +451,7 @@ int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
|
||||
}
|
||||
|
||||
static int svc_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 atm_vcc *vcc = ATM_SD(sock);
|
||||
@@ -464,7 +464,7 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
|
||||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (copy_from_user(&vcc->sap, optval, optlen)) {
|
||||
if (copy_from_sockptr(&vcc->sap, optval, optlen)) {
|
||||
error = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
@@ -475,7 +475,7 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
|
||||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (get_user(value, (int __user *)optval)) {
|
||||
if (copy_from_sockptr(&value, optval, sizeof(int))) {
|
||||
error = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -528,7 +528,7 @@ ax25_cb *ax25_create_cb(void)
|
||||
*/
|
||||
|
||||
static int ax25_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;
|
||||
ax25_cb *ax25;
|
||||
@@ -543,7 +543,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
|
||||
if (optlen < sizeof(unsigned int))
|
||||
return -EINVAL;
|
||||
|
||||
if (get_user(opt, (unsigned int __user *)optval))
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(unsigned int)))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
@@ -640,7 +640,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
memset(devname, 0, sizeof(devname));
|
||||
|
||||
if (copy_from_user(devname, optval, optlen)) {
|
||||
if (copy_from_sockptr(devname, optval, optlen)) {
|
||||
res = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1842,7 +1842,7 @@ drop:
|
||||
}
|
||||
|
||||
static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int len)
|
||||
sockptr_t optval, unsigned int len)
|
||||
{
|
||||
struct hci_ufilter uf = { .opcode = 0 };
|
||||
struct sock *sk = sock->sk;
|
||||
@@ -1862,7 +1862,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
switch (optname) {
|
||||
case HCI_DATA_DIR:
|
||||
if (get_user(opt, (int __user *)optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -1874,7 +1874,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
|
||||
case HCI_TIME_STAMP:
|
||||
if (get_user(opt, (int __user *)optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -1896,7 +1896,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
}
|
||||
|
||||
len = min_t(unsigned int, len, sizeof(uf));
|
||||
if (copy_from_user(&uf, optval, len)) {
|
||||
if (copy_from_sockptr(&uf, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -703,7 +703,7 @@ static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
|
||||
}
|
||||
|
||||
static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct l2cap_chan *chan = l2cap_pi(sk)->chan;
|
||||
@@ -736,7 +736,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
|
||||
opts.txwin_size = chan->tx_win;
|
||||
|
||||
len = min_t(unsigned int, sizeof(opts), optlen);
|
||||
if (copy_from_user((char *) &opts, optval, len)) {
|
||||
if (copy_from_sockptr(&opts, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -782,7 +782,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
|
||||
break;
|
||||
|
||||
case L2CAP_LM:
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -859,7 +859,7 @@ static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
|
||||
}
|
||||
|
||||
static int l2cap_sock_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 l2cap_chan *chan = l2cap_pi(sk)->chan;
|
||||
@@ -891,7 +891,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
sec.level = BT_SECURITY_LOW;
|
||||
|
||||
len = min_t(unsigned int, sizeof(sec), optlen);
|
||||
if (copy_from_user((char *) &sec, optval, len)) {
|
||||
if (copy_from_sockptr(&sec, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -939,7 +939,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -954,7 +954,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
|
||||
case BT_FLUSHABLE:
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -990,7 +990,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
|
||||
|
||||
len = min_t(unsigned int, sizeof(pwr), optlen);
|
||||
if (copy_from_user((char *) &pwr, optval, len)) {
|
||||
if (copy_from_sockptr(&pwr, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -1002,7 +1002,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
|
||||
case BT_CHANNEL_POLICY:
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -1050,7 +1050,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(opt, (u16 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u16))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -1081,7 +1081,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(opt, (u8 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u8))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -644,7 +644,8 @@ static int rfcomm_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
return len;
|
||||
}
|
||||
|
||||
static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
|
||||
static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname,
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
int err = 0;
|
||||
@@ -656,7 +657,7 @@ static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __u
|
||||
|
||||
switch (optname) {
|
||||
case RFCOMM_LM:
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -685,7 +686,8 @@ static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __u
|
||||
return err;
|
||||
}
|
||||
|
||||
static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
|
||||
static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
sockptr_t optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct bt_security sec;
|
||||
@@ -713,7 +715,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c
|
||||
sec.level = BT_SECURITY_LOW;
|
||||
|
||||
len = min_t(unsigned int, sizeof(sec), optlen);
|
||||
if (copy_from_user((char *) &sec, optval, len)) {
|
||||
if (copy_from_sockptr(&sec, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -732,7 +734,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -791,7 +791,7 @@ static int sco_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
}
|
||||
|
||||
static int sco_sock_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;
|
||||
int len, err = 0;
|
||||
@@ -810,7 +810,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
break;
|
||||
}
|
||||
|
||||
if (get_user(opt, (u32 __user *) optval)) {
|
||||
if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
@@ -831,7 +831,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
voice.setting = sco_pi(sk)->setting;
|
||||
|
||||
len = min_t(unsigned int, sizeof(voice), optlen);
|
||||
if (copy_from_user((char *)&voice, optval, len)) {
|
||||
if (copy_from_sockptr(&voice, optval, len)) {
|
||||
err = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -669,8 +669,8 @@ out_err:
|
||||
return sent ? : err;
|
||||
}
|
||||
|
||||
static int setsockopt(struct socket *sock,
|
||||
int lvl, int opt, char __user *ov, unsigned int ol)
|
||||
static int setsockopt(struct socket *sock, int lvl, int opt, sockptr_t ov,
|
||||
unsigned int ol)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct caifsock *cf_sk = container_of(sk, struct caifsock, sk);
|
||||
@@ -685,7 +685,7 @@ static int setsockopt(struct socket *sock,
|
||||
return -EINVAL;
|
||||
if (lvl != SOL_CAIF)
|
||||
goto bad_sol;
|
||||
if (copy_from_user(&linksel, ov, sizeof(int)))
|
||||
if (copy_from_sockptr(&linksel, ov, sizeof(int)))
|
||||
return -EINVAL;
|
||||
lock_sock(&(cf_sk->sk));
|
||||
cf_sk->conn_req.link_selector = linksel;
|
||||
@@ -699,7 +699,7 @@ static int setsockopt(struct socket *sock,
|
||||
return -ENOPROTOOPT;
|
||||
lock_sock(&(cf_sk->sk));
|
||||
if (ol > sizeof(cf_sk->conn_req.param.data) ||
|
||||
copy_from_user(&cf_sk->conn_req.param.data, ov, ol)) {
|
||||
copy_from_sockptr(&cf_sk->conn_req.param.data, ov, ol)) {
|
||||
release_sock(&cf_sk->sk);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user