Skip to content

Commit a7b75c5

Browse files
Christoph Hellwigdavem330
Christoph Hellwig
authored andcommitted
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 <[email protected]> Acked-by: Stefan Schmidt <[email protected]> [ieee802154] Acked-by: Matthieu Baerts <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d38d2b0 commit a7b75c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+246
-258
lines changed

crypto/af_alg.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
197197
return err;
198198
}
199199

200-
static int alg_setkey(struct sock *sk, char __user *ukey,
201-
unsigned int keylen)
200+
static int alg_setkey(struct sock *sk, sockptr_t ukey, unsigned int keylen)
202201
{
203202
struct alg_sock *ask = alg_sk(sk);
204203
const struct af_alg_type *type = ask->type;
@@ -210,7 +209,7 @@ static int alg_setkey(struct sock *sk, char __user *ukey,
210209
return -ENOMEM;
211210

212211
err = -EFAULT;
213-
if (copy_from_user(key, ukey, keylen))
212+
if (copy_from_sockptr(key, ukey, keylen))
214213
goto out;
215214

216215
err = type->setkey(ask->private, key, keylen);
@@ -222,7 +221,7 @@ static int alg_setkey(struct sock *sk, char __user *ukey,
222221
}
223222

224223
static int alg_setsockopt(struct socket *sock, int level, int optname,
225-
char __user *optval, unsigned int optlen)
224+
sockptr_t optval, unsigned int optlen)
226225
{
227226
struct sock *sk = sock->sk;
228227
struct alg_sock *ask = alg_sk(sk);

drivers/crypto/chelsio/chtls/chtls_main.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ static int chtls_getsockopt(struct sock *sk, int level, int optname,
488488
}
489489

490490
static int do_chtls_setsockopt(struct sock *sk, int optname,
491-
char __user *optval, unsigned int optlen)
491+
sockptr_t optval, unsigned int optlen)
492492
{
493493
struct tls_crypto_info *crypto_info, tmp_crypto_info;
494494
struct chtls_sock *csk;
@@ -498,12 +498,12 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
498498

499499
csk = rcu_dereference_sk_user_data(sk);
500500

501-
if (!optval || optlen < sizeof(*crypto_info)) {
501+
if (sockptr_is_null(optval) || optlen < sizeof(*crypto_info)) {
502502
rc = -EINVAL;
503503
goto out;
504504
}
505505

506-
rc = copy_from_user(&tmp_crypto_info, optval, sizeof(*crypto_info));
506+
rc = copy_from_sockptr(&tmp_crypto_info, optval, sizeof(*crypto_info));
507507
if (rc) {
508508
rc = -EFAULT;
509509
goto out;
@@ -525,8 +525,9 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
525525
/* Obtain version and type from previous copy */
526526
crypto_info[0] = tmp_crypto_info;
527527
/* Now copy the following data */
528-
rc = copy_from_user((char *)crypto_info + sizeof(*crypto_info),
529-
optval + sizeof(*crypto_info),
528+
sockptr_advance(optval, sizeof(*crypto_info));
529+
rc = copy_from_sockptr((char *)crypto_info + sizeof(*crypto_info),
530+
optval,
530531
sizeof(struct tls12_crypto_info_aes_gcm_128)
531532
- sizeof(*crypto_info));
532533

@@ -541,8 +542,9 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
541542
}
542543
case TLS_CIPHER_AES_GCM_256: {
543544
crypto_info[0] = tmp_crypto_info;
544-
rc = copy_from_user((char *)crypto_info + sizeof(*crypto_info),
545-
optval + sizeof(*crypto_info),
545+
sockptr_advance(optval, sizeof(*crypto_info));
546+
rc = copy_from_sockptr((char *)crypto_info + sizeof(*crypto_info),
547+
optval,
546548
sizeof(struct tls12_crypto_info_aes_gcm_256)
547549
- sizeof(*crypto_info));
548550

@@ -565,7 +567,7 @@ static int do_chtls_setsockopt(struct sock *sk, int optname,
565567
}
566568

567569
static int chtls_setsockopt(struct sock *sk, int level, int optname,
568-
char __user *optval, unsigned int optlen)
570+
sockptr_t optval, unsigned int optlen)
569571
{
570572
struct tls_context *ctx = tls_get_ctx(sk);
571573

drivers/isdn/mISDN/socket.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
401401
}
402402

403403
static int data_sock_setsockopt(struct socket *sock, int level, int optname,
404-
char __user *optval, unsigned int len)
404+
sockptr_t optval, unsigned int len)
405405
{
406406
struct sock *sk = sock->sk;
407407
int err = 0, opt = 0;
@@ -414,7 +414,7 @@ static int data_sock_setsockopt(struct socket *sock, int level, int optname,
414414

415415
switch (optname) {
416416
case MISDN_TIME_STAMP:
417-
if (get_user(opt, (int __user *)optval)) {
417+
if (copy_from_sockptr(&opt, optval, sizeof(int))) {
418418
err = -EFAULT;
419419
break;
420420
}

include/linux/net.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <linux/rcupdate.h>
2222
#include <linux/once.h>
2323
#include <linux/fs.h>
24+
#include <linux/sockptr.h>
2425

2526
#include <uapi/linux/net.h>
2627

@@ -162,7 +163,8 @@ struct proto_ops {
162163
int (*listen) (struct socket *sock, int len);
163164
int (*shutdown) (struct socket *sock, int flags);
164165
int (*setsockopt)(struct socket *sock, int level,
165-
int optname, char __user *optval, unsigned int optlen);
166+
int optname, sockptr_t optval,
167+
unsigned int optlen);
166168
int (*getsockopt)(struct socket *sock, int level,
167169
int optname, char __user *optval, int __user *optlen);
168170
void (*show_fdinfo)(struct seq_file *m, struct socket *sock);

include/net/inet_connection_sock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/timer.h>
1717
#include <linux/poll.h>
1818
#include <linux/kernel.h>
19+
#include <linux/sockptr.h>
1920

2021
#include <net/inet_sock.h>
2122
#include <net/request_sock.h>
@@ -45,7 +46,7 @@ struct inet_connection_sock_af_ops {
4546
u16 net_frag_header_len;
4647
u16 sockaddr_len;
4748
int (*setsockopt)(struct sock *sk, int level, int optname,
48-
char __user *optval, unsigned int optlen);
49+
sockptr_t optval, unsigned int optlen);
4950
int (*getsockopt)(struct sock *sk, int level, int optname,
5051
char __user *optval, int __user *optlen);
5152
void (*addr2sockaddr)(struct sock *sk, struct sockaddr *);

include/net/ip.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ void ip_cmsg_recv_offset(struct msghdr *msg, struct sock *sk,
722722
struct sk_buff *skb, int tlen, int offset);
723723
int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
724724
struct ipcm_cookie *ipc, bool allow_ipv6);
725-
int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
725+
int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
726726
unsigned int optlen);
727727
int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
728728
int __user *optlen);

include/net/ipv6.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,8 +1084,8 @@ struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
10841084
* socket options (ipv6_sockglue.c)
10851085
*/
10861086

1087-
int ipv6_setsockopt(struct sock *sk, int level, int optname,
1088-
char __user *optval, unsigned int optlen);
1087+
int ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
1088+
unsigned int optlen);
10891089
int ipv6_getsockopt(struct sock *sk, int level, int optname,
10901090
char __user *optval, int __user *optlen);
10911091

include/net/sctp/structs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ struct sctp_af {
431431
int (*setsockopt) (struct sock *sk,
432432
int level,
433433
int optname,
434-
char __user *optval,
434+
sockptr_t optval,
435435
unsigned int optlen);
436436
int (*getsockopt) (struct sock *sk,
437437
int level,

include/net/sock.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,7 +1141,7 @@ struct proto {
11411141
void (*destroy)(struct sock *sk);
11421142
void (*shutdown)(struct sock *sk, int how);
11431143
int (*setsockopt)(struct sock *sk, int level,
1144-
int optname, char __user *optval,
1144+
int optname, sockptr_t optval,
11451145
unsigned int optlen);
11461146
int (*getsockopt)(struct sock *sk, int level,
11471147
int optname, char __user *optval,
@@ -1734,7 +1734,7 @@ int sock_common_getsockopt(struct socket *sock, int level, int optname,
17341734
int sock_common_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
17351735
int flags);
17361736
int sock_common_setsockopt(struct socket *sock, int level, int optname,
1737-
char __user *optval, unsigned int optlen);
1737+
sockptr_t optval, unsigned int optlen);
17381738

17391739
void sk_common_release(struct sock *sk);
17401740

include/net/tcp.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,8 @@ __poll_t tcp_poll(struct file *file, struct socket *sock,
399399
struct poll_table_struct *wait);
400400
int tcp_getsockopt(struct sock *sk, int level, int optname,
401401
char __user *optval, int __user *optlen);
402-
int tcp_setsockopt(struct sock *sk, int level, int optname,
403-
char __user *optval, unsigned int optlen);
402+
int tcp_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
403+
unsigned int optlen);
404404
void tcp_set_keepalive(struct sock *sk, int val);
405405
void tcp_syn_ack_timeout(const struct request_sock *req);
406406
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,

net/atm/common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ static int check_qos(const struct atm_qos *qos)
745745
}
746746

747747
int vcc_setsockopt(struct socket *sock, int level, int optname,
748-
char __user *optval, unsigned int optlen)
748+
sockptr_t optval, unsigned int optlen)
749749
{
750750
struct atm_vcc *vcc;
751751
unsigned long value;
@@ -760,7 +760,7 @@ int vcc_setsockopt(struct socket *sock, int level, int optname,
760760
{
761761
struct atm_qos qos;
762762

763-
if (copy_from_user(&qos, optval, sizeof(qos)))
763+
if (copy_from_sockptr(&qos, optval, sizeof(qos)))
764764
return -EFAULT;
765765
error = check_qos(&qos);
766766
if (error)
@@ -774,7 +774,7 @@ int vcc_setsockopt(struct socket *sock, int level, int optname,
774774
return 0;
775775
}
776776
case SO_SETCLP:
777-
if (get_user(value, (unsigned long __user *)optval))
777+
if (copy_from_sockptr(&value, optval, sizeof(value)))
778778
return -EFAULT;
779779
if (value)
780780
vcc->atm_options |= ATM_ATMOPT_CLP;

net/atm/common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
2121
int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
2222
int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
2323
int vcc_setsockopt(struct socket *sock, int level, int optname,
24-
char __user *optval, unsigned int optlen);
24+
sockptr_t optval, unsigned int optlen);
2525
int vcc_getsockopt(struct socket *sock, int level, int optname,
2626
char __user *optval, int __user *optlen);
2727
void vcc_process_recv_queue(struct atm_vcc *vcc);

net/atm/pvc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ static int pvc_connect(struct socket *sock, struct sockaddr *sockaddr,
6363
}
6464

6565
static int pvc_setsockopt(struct socket *sock, int level, int optname,
66-
char __user *optval, unsigned int optlen)
66+
sockptr_t optval, unsigned int optlen)
6767
{
6868
struct sock *sk = sock->sk;
6969
int error;

net/atm/svc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
451451
}
452452

453453
static int svc_setsockopt(struct socket *sock, int level, int optname,
454-
char __user *optval, unsigned int optlen)
454+
sockptr_t optval, unsigned int optlen)
455455
{
456456
struct sock *sk = sock->sk;
457457
struct atm_vcc *vcc = ATM_SD(sock);
@@ -464,7 +464,7 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
464464
error = -EINVAL;
465465
goto out;
466466
}
467-
if (copy_from_user(&vcc->sap, optval, optlen)) {
467+
if (copy_from_sockptr(&vcc->sap, optval, optlen)) {
468468
error = -EFAULT;
469469
goto out;
470470
}
@@ -475,7 +475,7 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
475475
error = -EINVAL;
476476
goto out;
477477
}
478-
if (get_user(value, (int __user *)optval)) {
478+
if (copy_from_sockptr(&value, optval, sizeof(int))) {
479479
error = -EFAULT;
480480
goto out;
481481
}

net/ax25/af_ax25.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ ax25_cb *ax25_create_cb(void)
528528
*/
529529

530530
static int ax25_setsockopt(struct socket *sock, int level, int optname,
531-
char __user *optval, unsigned int optlen)
531+
sockptr_t optval, unsigned int optlen)
532532
{
533533
struct sock *sk = sock->sk;
534534
ax25_cb *ax25;
@@ -543,7 +543,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
543543
if (optlen < sizeof(unsigned int))
544544
return -EINVAL;
545545

546-
if (get_user(opt, (unsigned int __user *)optval))
546+
if (copy_from_sockptr(&opt, optval, sizeof(unsigned int)))
547547
return -EFAULT;
548548

549549
lock_sock(sk);
@@ -640,7 +640,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
640640

641641
memset(devname, 0, sizeof(devname));
642642

643-
if (copy_from_user(devname, optval, optlen)) {
643+
if (copy_from_sockptr(devname, optval, optlen)) {
644644
res = -EFAULT;
645645
break;
646646
}

net/bluetooth/hci_sock.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,7 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
18421842
}
18431843

18441844
static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
1845-
char __user *optval, unsigned int len)
1845+
sockptr_t optval, unsigned int len)
18461846
{
18471847
struct hci_ufilter uf = { .opcode = 0 };
18481848
struct sock *sk = sock->sk;
@@ -1862,7 +1862,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
18621862

18631863
switch (optname) {
18641864
case HCI_DATA_DIR:
1865-
if (get_user(opt, (int __user *)optval)) {
1865+
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
18661866
err = -EFAULT;
18671867
break;
18681868
}
@@ -1874,7 +1874,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
18741874
break;
18751875

18761876
case HCI_TIME_STAMP:
1877-
if (get_user(opt, (int __user *)optval)) {
1877+
if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
18781878
err = -EFAULT;
18791879
break;
18801880
}
@@ -1896,7 +1896,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
18961896
}
18971897

18981898
len = min_t(unsigned int, len, sizeof(uf));
1899-
if (copy_from_user(&uf, optval, len)) {
1899+
if (copy_from_sockptr(&uf, optval, len)) {
19001900
err = -EFAULT;
19011901
break;
19021902
}

0 commit comments

Comments
 (0)