.. | .. |
---|
23 | 23 | */ |
---|
24 | 24 | |
---|
25 | 25 | /* Bluetooth HCI sockets. */ |
---|
26 | | - |
---|
| 26 | +#include <linux/compat.h> |
---|
27 | 27 | #include <linux/export.h> |
---|
28 | 28 | #include <linux/utsname.h> |
---|
29 | 29 | #include <linux/sched.h> |
---|
.. | .. |
---|
52 | 52 | struct bt_sock bt; |
---|
53 | 53 | struct hci_dev *hdev; |
---|
54 | 54 | struct hci_filter filter; |
---|
55 | | - __u32 cmsg_mask; |
---|
| 55 | + __u8 cmsg_mask; |
---|
56 | 56 | unsigned short channel; |
---|
57 | 57 | unsigned long flags; |
---|
58 | 58 | __u32 cookie; |
---|
.. | .. |
---|
222 | 222 | if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT && |
---|
223 | 223 | hci_skb_pkt_type(skb) != HCI_EVENT_PKT && |
---|
224 | 224 | hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT && |
---|
225 | | - hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) |
---|
| 225 | + hci_skb_pkt_type(skb) != HCI_SCODATA_PKT && |
---|
| 226 | + hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) |
---|
226 | 227 | continue; |
---|
227 | 228 | if (is_filtered_packet(sk, skb)) |
---|
228 | 229 | continue; |
---|
.. | .. |
---|
231 | 232 | continue; |
---|
232 | 233 | if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT && |
---|
233 | 234 | hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT && |
---|
234 | | - hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) |
---|
| 235 | + hci_skb_pkt_type(skb) != HCI_SCODATA_PKT && |
---|
| 236 | + hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) |
---|
235 | 237 | continue; |
---|
236 | 238 | } else { |
---|
237 | 239 | /* Don't send frame to other channel types */ |
---|
.. | .. |
---|
334 | 336 | opcode = cpu_to_le16(HCI_MON_SCO_RX_PKT); |
---|
335 | 337 | else |
---|
336 | 338 | opcode = cpu_to_le16(HCI_MON_SCO_TX_PKT); |
---|
| 339 | + break; |
---|
| 340 | + case HCI_ISODATA_PKT: |
---|
| 341 | + if (bt_cb(skb)->incoming) |
---|
| 342 | + opcode = cpu_to_le16(HCI_MON_ISO_RX_PKT); |
---|
| 343 | + else |
---|
| 344 | + opcode = cpu_to_le16(HCI_MON_ISO_TX_PKT); |
---|
337 | 345 | break; |
---|
338 | 346 | case HCI_DIAG_PKT: |
---|
339 | 347 | opcode = cpu_to_le16(HCI_MON_VENDOR_DIAG); |
---|
.. | .. |
---|
446 | 454 | case HCI_DEV_SETUP: |
---|
447 | 455 | if (hdev->manufacturer == 0xffff) |
---|
448 | 456 | return NULL; |
---|
449 | | - |
---|
450 | | - /* fall through */ |
---|
| 457 | + fallthrough; |
---|
451 | 458 | |
---|
452 | 459 | case HCI_DEV_UP: |
---|
453 | 460 | skb = bt_skb_alloc(HCI_MON_INDEX_INFO_SIZE, GFP_ATOMIC); |
---|
.. | .. |
---|
1062 | 1069 | return err; |
---|
1063 | 1070 | } |
---|
1064 | 1071 | |
---|
| 1072 | +#ifdef CONFIG_COMPAT |
---|
| 1073 | +static int hci_sock_compat_ioctl(struct socket *sock, unsigned int cmd, |
---|
| 1074 | + unsigned long arg) |
---|
| 1075 | +{ |
---|
| 1076 | + switch (cmd) { |
---|
| 1077 | + case HCIDEVUP: |
---|
| 1078 | + case HCIDEVDOWN: |
---|
| 1079 | + case HCIDEVRESET: |
---|
| 1080 | + case HCIDEVRESTAT: |
---|
| 1081 | + return hci_sock_ioctl(sock, cmd, arg); |
---|
| 1082 | + } |
---|
| 1083 | + |
---|
| 1084 | + return hci_sock_ioctl(sock, cmd, (unsigned long)compat_ptr(arg)); |
---|
| 1085 | +} |
---|
| 1086 | +#endif |
---|
| 1087 | + |
---|
1065 | 1088 | static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, |
---|
1066 | 1089 | int addr_len) |
---|
1067 | 1090 | { |
---|
.. | .. |
---|
1392 | 1415 | static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, |
---|
1393 | 1416 | struct sk_buff *skb) |
---|
1394 | 1417 | { |
---|
1395 | | - __u32 mask = hci_pi(sk)->cmsg_mask; |
---|
| 1418 | + __u8 mask = hci_pi(sk)->cmsg_mask; |
---|
1396 | 1419 | |
---|
1397 | 1420 | if (mask & HCI_CMSG_DIR) { |
---|
1398 | 1421 | int incoming = bt_cb(skb)->incoming; |
---|
.. | .. |
---|
1402 | 1425 | |
---|
1403 | 1426 | if (mask & HCI_CMSG_TSTAMP) { |
---|
1404 | 1427 | #ifdef CONFIG_COMPAT |
---|
1405 | | - struct compat_timeval ctv; |
---|
| 1428 | + struct old_timeval32 ctv; |
---|
1406 | 1429 | #endif |
---|
1407 | | - struct timeval tv; |
---|
| 1430 | + struct __kernel_old_timeval tv; |
---|
1408 | 1431 | void *data; |
---|
1409 | 1432 | int len; |
---|
1410 | 1433 | |
---|
.. | .. |
---|
1572 | 1595 | } |
---|
1573 | 1596 | } |
---|
1574 | 1597 | |
---|
1575 | | - no_hdev = (handler->flags & HCI_MGMT_NO_HDEV); |
---|
1576 | | - if (no_hdev != !hdev) { |
---|
1577 | | - err = mgmt_cmd_status(sk, index, opcode, |
---|
1578 | | - MGMT_STATUS_INVALID_INDEX); |
---|
1579 | | - goto done; |
---|
| 1598 | + if (!(handler->flags & HCI_MGMT_HDEV_OPTIONAL)) { |
---|
| 1599 | + no_hdev = (handler->flags & HCI_MGMT_NO_HDEV); |
---|
| 1600 | + if (no_hdev != !hdev) { |
---|
| 1601 | + err = mgmt_cmd_status(sk, index, opcode, |
---|
| 1602 | + MGMT_STATUS_INVALID_INDEX); |
---|
| 1603 | + goto done; |
---|
| 1604 | + } |
---|
1580 | 1605 | } |
---|
1581 | 1606 | |
---|
1582 | 1607 | var_len = (handler->flags & HCI_MGMT_VAR_LEN); |
---|
.. | .. |
---|
1766 | 1791 | */ |
---|
1767 | 1792 | if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT && |
---|
1768 | 1793 | hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT && |
---|
1769 | | - hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) { |
---|
| 1794 | + hci_skb_pkt_type(skb) != HCI_SCODATA_PKT && |
---|
| 1795 | + hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) { |
---|
1770 | 1796 | err = -EINVAL; |
---|
1771 | 1797 | goto drop; |
---|
1772 | 1798 | } |
---|
.. | .. |
---|
1810 | 1836 | } |
---|
1811 | 1837 | |
---|
1812 | 1838 | if (hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT && |
---|
1813 | | - hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) { |
---|
| 1839 | + hci_skb_pkt_type(skb) != HCI_SCODATA_PKT && |
---|
| 1840 | + hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) { |
---|
1814 | 1841 | err = -EINVAL; |
---|
1815 | 1842 | goto drop; |
---|
1816 | 1843 | } |
---|
.. | .. |
---|
1831 | 1858 | } |
---|
1832 | 1859 | |
---|
1833 | 1860 | static int hci_sock_setsockopt(struct socket *sock, int level, int optname, |
---|
1834 | | - char __user *optval, unsigned int len) |
---|
| 1861 | + sockptr_t optval, unsigned int len) |
---|
1835 | 1862 | { |
---|
1836 | 1863 | struct hci_ufilter uf = { .opcode = 0 }; |
---|
1837 | 1864 | struct sock *sk = sock->sk; |
---|
.. | .. |
---|
1851 | 1878 | |
---|
1852 | 1879 | switch (optname) { |
---|
1853 | 1880 | case HCI_DATA_DIR: |
---|
1854 | | - if (get_user(opt, (int __user *)optval)) { |
---|
| 1881 | + if (copy_from_sockptr(&opt, optval, sizeof(opt))) { |
---|
1855 | 1882 | err = -EFAULT; |
---|
1856 | 1883 | break; |
---|
1857 | 1884 | } |
---|
.. | .. |
---|
1863 | 1890 | break; |
---|
1864 | 1891 | |
---|
1865 | 1892 | case HCI_TIME_STAMP: |
---|
1866 | | - if (get_user(opt, (int __user *)optval)) { |
---|
| 1893 | + if (copy_from_sockptr(&opt, optval, sizeof(opt))) { |
---|
1867 | 1894 | err = -EFAULT; |
---|
1868 | 1895 | break; |
---|
1869 | 1896 | } |
---|
.. | .. |
---|
1885 | 1912 | } |
---|
1886 | 1913 | |
---|
1887 | 1914 | len = min_t(unsigned int, len, sizeof(uf)); |
---|
1888 | | - if (copy_from_user(&uf, optval, len)) { |
---|
| 1915 | + if (copy_from_sockptr(&uf, optval, len)) { |
---|
1889 | 1916 | err = -EFAULT; |
---|
1890 | 1917 | break; |
---|
1891 | 1918 | } |
---|
.. | .. |
---|
1994 | 2021 | .sendmsg = hci_sock_sendmsg, |
---|
1995 | 2022 | .recvmsg = hci_sock_recvmsg, |
---|
1996 | 2023 | .ioctl = hci_sock_ioctl, |
---|
| 2024 | +#ifdef CONFIG_COMPAT |
---|
| 2025 | + .compat_ioctl = hci_sock_compat_ioctl, |
---|
| 2026 | +#endif |
---|
1997 | 2027 | .poll = datagram_poll, |
---|
1998 | 2028 | .listen = sock_no_listen, |
---|
1999 | 2029 | .shutdown = sock_no_shutdown, |
---|