hc
2024-02-19 1c055e55a242a33e574e48be530e06770a210dcd
kernel/net/bluetooth/rfcomm/sock.c
....@@ -24,7 +24,7 @@
2424 /*
2525 * RFCOMM sockets.
2626 */
27
-
27
+#include <linux/compat.h>
2828 #include <linux/export.h>
2929 #include <linux/debugfs.h>
3030 #include <linux/sched/signal.h>
....@@ -64,15 +64,13 @@
6464 static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
6565 {
6666 struct sock *sk = d->owner, *parent;
67
- unsigned long flags;
6867
6968 if (!sk)
7069 return;
7170
7271 BT_DBG("dlc %p state %ld err %d", d, d->state, err);
7372
74
- local_irq_save(flags);
75
- bh_lock_sock(sk);
73
+ spin_lock_bh(&sk->sk_lock.slock);
7674
7775 if (err)
7876 sk->sk_err = err;
....@@ -93,8 +91,7 @@
9391 sk->sk_state_change(sk);
9492 }
9593
96
- bh_unlock_sock(sk);
97
- local_irq_restore(flags);
94
+ spin_unlock_bh(&sk->sk_lock.slock);
9895
9996 if (parent && sock_flag(sk, SOCK_ZAPPED)) {
10097 /* We have to drop DLC lock here, otherwise
....@@ -221,7 +218,7 @@
221218 case BT_CONFIG:
222219 case BT_CONNECTED:
223220 rfcomm_dlc_close(d, 0);
224
- /* fall through */
221
+ fallthrough;
225222
226223 default:
227224 sock_set_flag(sk, SOCK_ZAPPED);
....@@ -578,46 +575,20 @@
578575 lock_sock(sk);
579576
580577 sent = bt_sock_wait_ready(sk, msg->msg_flags);
581
- if (sent)
582
- goto done;
583578
584
- while (len) {
585
- size_t size = min_t(size_t, len, d->mtu);
586
- int err;
587
-
588
- skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
589
- msg->msg_flags & MSG_DONTWAIT, &err);
590
- if (!skb) {
591
- if (sent == 0)
592
- sent = err;
593
- break;
594
- }
595
- skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
596
-
597
- err = memcpy_from_msg(skb_put(skb, size), msg, size);
598
- if (err) {
599
- kfree_skb(skb);
600
- if (sent == 0)
601
- sent = err;
602
- break;
603
- }
604
-
605
- skb->priority = sk->sk_priority;
606
-
607
- err = rfcomm_dlc_send(d, skb);
608
- if (err < 0) {
609
- kfree_skb(skb);
610
- if (sent == 0)
611
- sent = err;
612
- break;
613
- }
614
-
615
- sent += size;
616
- len -= size;
617
- }
618
-
619
-done:
620579 release_sock(sk);
580
+
581
+ if (sent)
582
+ return sent;
583
+
584
+ skb = bt_skb_sendmmsg(sk, msg, len, d->mtu, RFCOMM_SKB_HEAD_RESERVE,
585
+ RFCOMM_SKB_TAIL_RESERVE);
586
+ if (IS_ERR(skb))
587
+ return PTR_ERR(skb);
588
+
589
+ sent = rfcomm_dlc_send(d, skb);
590
+ if (sent < 0)
591
+ kfree_skb(skb);
621592
622593 return sent;
623594 }
....@@ -647,7 +618,8 @@
647618 return len;
648619 }
649620
650
-static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
621
+static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname,
622
+ sockptr_t optval, unsigned int optlen)
651623 {
652624 struct sock *sk = sock->sk;
653625 int err = 0;
....@@ -659,7 +631,7 @@
659631
660632 switch (optname) {
661633 case RFCOMM_LM:
662
- if (get_user(opt, (u32 __user *) optval)) {
634
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
663635 err = -EFAULT;
664636 break;
665637 }
....@@ -688,7 +660,8 @@
688660 return err;
689661 }
690662
691
-static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
663
+static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname,
664
+ sockptr_t optval, unsigned int optlen)
692665 {
693666 struct sock *sk = sock->sk;
694667 struct bt_security sec;
....@@ -716,7 +689,7 @@
716689 sec.level = BT_SECURITY_LOW;
717690
718691 len = min_t(unsigned int, sizeof(sec), optlen);
719
- if (copy_from_user((char *) &sec, optval, len)) {
692
+ if (copy_from_sockptr(&sec, optval, len)) {
720693 err = -EFAULT;
721694 break;
722695 }
....@@ -735,7 +708,7 @@
735708 break;
736709 }
737710
738
- if (get_user(opt, (u32 __user *) optval)) {
711
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
739712 err = -EFAULT;
740713 break;
741714 }
....@@ -909,6 +882,13 @@
909882 return err;
910883 }
911884
885
+#ifdef CONFIG_COMPAT
886
+static int rfcomm_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
887
+{
888
+ return rfcomm_sock_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
889
+}
890
+#endif
891
+
912892 static int rfcomm_sock_shutdown(struct socket *sock, int how)
913893 {
914894 struct sock *sk = sock->sk;
....@@ -1020,17 +1000,7 @@
10201000 return 0;
10211001 }
10221002
1023
-static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file)
1024
-{
1025
- return single_open(file, rfcomm_sock_debugfs_show, inode->i_private);
1026
-}
1027
-
1028
-static const struct file_operations rfcomm_sock_debugfs_fops = {
1029
- .open = rfcomm_sock_debugfs_open,
1030
- .read = seq_read,
1031
- .llseek = seq_lseek,
1032
- .release = single_release,
1033
-};
1003
+DEFINE_SHOW_ATTRIBUTE(rfcomm_sock_debugfs);
10341004
10351005 static struct dentry *rfcomm_sock_debugfs;
10361006
....@@ -1049,9 +1019,13 @@
10491019 .setsockopt = rfcomm_sock_setsockopt,
10501020 .getsockopt = rfcomm_sock_getsockopt,
10511021 .ioctl = rfcomm_sock_ioctl,
1022
+ .gettstamp = sock_gettstamp,
10521023 .poll = bt_sock_poll,
10531024 .socketpair = sock_no_socketpair,
1054
- .mmap = sock_no_mmap
1025
+ .mmap = sock_no_mmap,
1026
+#ifdef CONFIG_COMPAT
1027
+ .compat_ioctl = rfcomm_sock_compat_ioctl,
1028
+#endif
10551029 };
10561030
10571031 static const struct net_proto_family rfcomm_sock_family_ops = {