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>
....@@ -218,7 +218,7 @@
218218 case BT_CONFIG:
219219 case BT_CONNECTED:
220220 rfcomm_dlc_close(d, 0);
221
- /* fall through */
221
+ fallthrough;
222222
223223 default:
224224 sock_set_flag(sk, SOCK_ZAPPED);
....@@ -575,46 +575,20 @@
575575 lock_sock(sk);
576576
577577 sent = bt_sock_wait_ready(sk, msg->msg_flags);
578
- if (sent)
579
- goto done;
580578
581
- while (len) {
582
- size_t size = min_t(size_t, len, d->mtu);
583
- int err;
584
-
585
- skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
586
- msg->msg_flags & MSG_DONTWAIT, &err);
587
- if (!skb) {
588
- if (sent == 0)
589
- sent = err;
590
- break;
591
- }
592
- skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
593
-
594
- err = memcpy_from_msg(skb_put(skb, size), msg, size);
595
- if (err) {
596
- kfree_skb(skb);
597
- if (sent == 0)
598
- sent = err;
599
- break;
600
- }
601
-
602
- skb->priority = sk->sk_priority;
603
-
604
- err = rfcomm_dlc_send(d, skb);
605
- if (err < 0) {
606
- kfree_skb(skb);
607
- if (sent == 0)
608
- sent = err;
609
- break;
610
- }
611
-
612
- sent += size;
613
- len -= size;
614
- }
615
-
616
-done:
617579 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);
618592
619593 return sent;
620594 }
....@@ -644,7 +618,8 @@
644618 return len;
645619 }
646620
647
-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)
648623 {
649624 struct sock *sk = sock->sk;
650625 int err = 0;
....@@ -656,7 +631,7 @@
656631
657632 switch (optname) {
658633 case RFCOMM_LM:
659
- if (get_user(opt, (u32 __user *) optval)) {
634
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
660635 err = -EFAULT;
661636 break;
662637 }
....@@ -685,7 +660,8 @@
685660 return err;
686661 }
687662
688
-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)
689665 {
690666 struct sock *sk = sock->sk;
691667 struct bt_security sec;
....@@ -713,7 +689,7 @@
713689 sec.level = BT_SECURITY_LOW;
714690
715691 len = min_t(unsigned int, sizeof(sec), optlen);
716
- if (copy_from_user((char *) &sec, optval, len)) {
692
+ if (copy_from_sockptr(&sec, optval, len)) {
717693 err = -EFAULT;
718694 break;
719695 }
....@@ -732,7 +708,7 @@
732708 break;
733709 }
734710
735
- if (get_user(opt, (u32 __user *) optval)) {
711
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
736712 err = -EFAULT;
737713 break;
738714 }
....@@ -906,6 +882,13 @@
906882 return err;
907883 }
908884
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
+
909892 static int rfcomm_sock_shutdown(struct socket *sock, int how)
910893 {
911894 struct sock *sk = sock->sk;
....@@ -1017,17 +1000,7 @@
10171000 return 0;
10181001 }
10191002
1020
-static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file)
1021
-{
1022
- return single_open(file, rfcomm_sock_debugfs_show, inode->i_private);
1023
-}
1024
-
1025
-static const struct file_operations rfcomm_sock_debugfs_fops = {
1026
- .open = rfcomm_sock_debugfs_open,
1027
- .read = seq_read,
1028
- .llseek = seq_lseek,
1029
- .release = single_release,
1030
-};
1003
+DEFINE_SHOW_ATTRIBUTE(rfcomm_sock_debugfs);
10311004
10321005 static struct dentry *rfcomm_sock_debugfs;
10331006
....@@ -1046,9 +1019,13 @@
10461019 .setsockopt = rfcomm_sock_setsockopt,
10471020 .getsockopt = rfcomm_sock_getsockopt,
10481021 .ioctl = rfcomm_sock_ioctl,
1022
+ .gettstamp = sock_gettstamp,
10491023 .poll = bt_sock_poll,
10501024 .socketpair = sock_no_socketpair,
1051
- .mmap = sock_no_mmap
1025
+ .mmap = sock_no_mmap,
1026
+#ifdef CONFIG_COMPAT
1027
+ .compat_ioctl = rfcomm_sock_compat_ioctl,
1028
+#endif
10521029 };
10531030
10541031 static const struct net_proto_family rfcomm_sock_family_ops = {