hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/net/can/raw.c
....@@ -1,5 +1,5 @@
1
-/*
2
- * raw.c - Raw sockets for protocol family CAN
1
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
2
+/* raw.c - Raw sockets for protocol family CAN
33 *
44 * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
55 * All rights reserved.
....@@ -55,17 +55,16 @@
5555 #include <net/sock.h>
5656 #include <net/net_namespace.h>
5757
58
-#define CAN_RAW_VERSION CAN_VERSION
59
-
6058 MODULE_DESCRIPTION("PF_CAN raw protocol");
6159 MODULE_LICENSE("Dual BSD/GPL");
6260 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
6361 MODULE_ALIAS("can-proto-1");
6462
63
+#define RAW_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
64
+
6565 #define MASK_ALL 0
6666
67
-/*
68
- * A raw socket has a list of can_filters attached to it, each receiving
67
+/* A raw socket has a list of can_filters attached to it, each receiving
6968 * the CAN frames matching that filter. If the filter list is empty,
7069 * no CAN frames will be received by the socket. The default after
7170 * opening the socket, is to have one filter which receives all frames.
....@@ -100,8 +99,7 @@
10099 static DEFINE_SPINLOCK(raw_notifier_lock);
101100 static struct raw_sock *raw_busy_notifier;
102101
103
-/*
104
- * Return pointer to store the extra msg flags for raw_recvmsg().
102
+/* Return pointer to store the extra msg flags for raw_recvmsg().
105103 * We use the space of one unsigned int beyond the 'struct sockaddr_can'
106104 * in skb->cb.
107105 */
....@@ -160,17 +158,16 @@
160158 if (!skb)
161159 return;
162160
163
- /*
164
- * Put the datagram to the queue so that raw_recvmsg() can
165
- * get it from there. We need to pass the interface index to
166
- * raw_recvmsg(). We pass a whole struct sockaddr_can in skb->cb
167
- * containing the interface index.
161
+ /* Put the datagram to the queue so that raw_recvmsg() can get
162
+ * it from there. We need to pass the interface index to
163
+ * raw_recvmsg(). We pass a whole struct sockaddr_can in
164
+ * skb->cb containing the interface index.
168165 */
169166
170167 sock_skb_cb_check_size(sizeof(struct sockaddr_can));
171168 addr = (struct sockaddr_can *)skb->cb;
172169 memset(addr, 0, sizeof(*addr));
173
- addr->can_family = AF_CAN;
170
+ addr->can_family = AF_CAN;
174171 addr->can_ifindex = skb->dev->ifindex;
175172
176173 /* add CAN specific message flags for raw_recvmsg() */
....@@ -282,7 +279,6 @@
282279 return;
283280
284281 switch (msg) {
285
-
286282 case NETDEV_UNREGISTER:
287283 lock_sock(sk);
288284 /* remove current filters & unregister */
....@@ -293,8 +289,8 @@
293289 kfree(ro->filter);
294290
295291 ro->ifindex = 0;
296
- ro->bound = 0;
297
- ro->count = 0;
292
+ ro->bound = 0;
293
+ ro->count = 0;
298294 release_sock(sk);
299295
300296 sk->sk_err = ENODEV;
....@@ -396,16 +392,17 @@
396392 raw_disable_allfilters(dev_net(dev), dev, sk);
397393 dev_put(dev);
398394 }
399
- } else
395
+ } else {
400396 raw_disable_allfilters(sock_net(sk), NULL, sk);
397
+ }
401398 }
402399
403400 if (ro->count > 1)
404401 kfree(ro->filter);
405402
406403 ro->ifindex = 0;
407
- ro->bound = 0;
408
- ro->count = 0;
404
+ ro->bound = 0;
405
+ ro->count = 0;
409406 free_percpu(ro->uniq);
410407
411408 sock_orphan(sk);
....@@ -426,7 +423,7 @@
426423 int err = 0;
427424 int notify_enetdown = 0;
428425
429
- if (len < sizeof(*addr))
426
+ if (len < RAW_MIN_NAMELEN)
430427 return -EINVAL;
431428 if (addr->can_family != AF_CAN)
432429 return -EINVAL;
....@@ -477,8 +474,9 @@
477474 dev, sk);
478475 dev_put(dev);
479476 }
480
- } else
477
+ } else {
481478 raw_disable_allfilters(sock_net(sk), NULL, sk);
479
+ }
482480 }
483481 ro->ifindex = ifindex;
484482 ro->bound = 1;
....@@ -506,15 +504,15 @@
506504 if (peer)
507505 return -EOPNOTSUPP;
508506
509
- memset(addr, 0, sizeof(*addr));
507
+ memset(addr, 0, RAW_MIN_NAMELEN);
510508 addr->can_family = AF_CAN;
511509 addr->can_ifindex = ro->ifindex;
512510
513
- return sizeof(*addr);
511
+ return RAW_MIN_NAMELEN;
514512 }
515513
516514 static int raw_setsockopt(struct socket *sock, int level, int optname,
517
- char __user *optval, unsigned int optlen)
515
+ sockptr_t optval, unsigned int optlen)
518516 {
519517 struct sock *sk = sock->sk;
520518 struct raw_sock *ro = raw_sk(sk);
....@@ -529,7 +527,6 @@
529527 return -EINVAL;
530528
531529 switch (optname) {
532
-
533530 case CAN_RAW_FILTER:
534531 if (optlen % sizeof(struct can_filter) != 0)
535532 return -EINVAL;
....@@ -541,11 +538,11 @@
541538
542539 if (count > 1) {
543540 /* filter does not fit into dfilter => alloc space */
544
- filter = memdup_user(optval, optlen);
541
+ filter = memdup_sockptr(optval, optlen);
545542 if (IS_ERR(filter))
546543 return PTR_ERR(filter);
547544 } else if (count == 1) {
548
- if (copy_from_user(&sfilter, optval, sizeof(sfilter)))
545
+ if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
549546 return -EFAULT;
550547 }
551548
....@@ -607,7 +604,7 @@
607604 if (optlen != sizeof(err_mask))
608605 return -EINVAL;
609606
610
- if (copy_from_user(&err_mask, optval, optlen))
607
+ if (copy_from_sockptr(&err_mask, optval, optlen))
611608 return -EFAULT;
612609
613610 err_mask &= CAN_ERR_MASK;
....@@ -653,7 +650,7 @@
653650 if (optlen != sizeof(ro->loopback))
654651 return -EINVAL;
655652
656
- if (copy_from_user(&ro->loopback, optval, optlen))
653
+ if (copy_from_sockptr(&ro->loopback, optval, optlen))
657654 return -EFAULT;
658655
659656 break;
....@@ -662,7 +659,7 @@
662659 if (optlen != sizeof(ro->recv_own_msgs))
663660 return -EINVAL;
664661
665
- if (copy_from_user(&ro->recv_own_msgs, optval, optlen))
662
+ if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
666663 return -EFAULT;
667664
668665 break;
....@@ -671,7 +668,7 @@
671668 if (optlen != sizeof(ro->fd_frames))
672669 return -EINVAL;
673670
674
- if (copy_from_user(&ro->fd_frames, optval, optlen))
671
+ if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
675672 return -EFAULT;
676673
677674 break;
....@@ -680,7 +677,7 @@
680677 if (optlen != sizeof(ro->join_filters))
681678 return -EINVAL;
682679
683
- if (copy_from_user(&ro->join_filters, optval, optlen))
680
+ if (copy_from_sockptr(&ro->join_filters, optval, optlen))
684681 return -EFAULT;
685682
686683 break;
....@@ -708,17 +705,18 @@
708705 return -EINVAL;
709706
710707 switch (optname) {
711
-
712708 case CAN_RAW_FILTER:
713709 lock_sock(sk);
714710 if (ro->count > 0) {
715711 int fsize = ro->count * sizeof(struct can_filter);
712
+
716713 if (len > fsize)
717714 len = fsize;
718715 if (copy_to_user(optval, ro->filter, len))
719716 err = -EFAULT;
720
- } else
717
+ } else {
721718 len = 0;
719
+ }
722720 release_sock(sk);
723721
724722 if (!err)
....@@ -778,15 +776,16 @@
778776 if (msg->msg_name) {
779777 DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
780778
781
- if (msg->msg_namelen < sizeof(*addr))
779
+ if (msg->msg_namelen < RAW_MIN_NAMELEN)
782780 return -EINVAL;
783781
784782 if (addr->can_family != AF_CAN)
785783 return -EINVAL;
786784
787785 ifindex = addr->can_ifindex;
788
- } else
786
+ } else {
789787 ifindex = ro->ifindex;
788
+ }
790789
791790 dev = dev_get_by_index(sock_net(sk), ifindex);
792791 if (!dev)
....@@ -814,10 +813,10 @@
814813 if (err < 0)
815814 goto free_skb;
816815
817
- sock_tx_timestamp(sk, sk->sk_tsflags, &skb_shinfo(skb)->tx_flags);
816
+ skb_setup_tx_timestamp(skb, sk->sk_tsflags);
818817
819818 skb->dev = dev;
820
- skb->sk = sk;
819
+ skb->sk = sk;
821820 skb->priority = sk->sk_priority;
822821
823822 err = can_send(skb, ro->loopback);
....@@ -845,8 +844,12 @@
845844 int err = 0;
846845 int noblock;
847846
848
- noblock = flags & MSG_DONTWAIT;
849
- flags &= ~MSG_DONTWAIT;
847
+ noblock = flags & MSG_DONTWAIT;
848
+ flags &= ~MSG_DONTWAIT;
849
+
850
+ if (flags & MSG_ERRQUEUE)
851
+ return sock_recv_errqueue(sk, msg, size,
852
+ SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
850853
851854 skb = skb_recv_datagram(sk, flags, noblock, &err);
852855 if (!skb)
....@@ -866,8 +869,8 @@
866869 sock_recv_ts_and_drops(msg, sk, skb);
867870
868871 if (msg->msg_name) {
869
- __sockaddr_check_size(sizeof(struct sockaddr_can));
870
- msg->msg_namelen = sizeof(struct sockaddr_can);
872
+ __sockaddr_check_size(RAW_MIN_NAMELEN);
873
+ msg->msg_namelen = RAW_MIN_NAMELEN;
871874 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
872875 }
873876
....@@ -879,6 +882,13 @@
879882 return size;
880883 }
881884
885
+static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
886
+ unsigned long arg)
887
+{
888
+ /* no ioctls for socket layer -> hand it down to NIC layer */
889
+ return -ENOIOCTLCMD;
890
+}
891
+
882892 static const struct proto_ops raw_ops = {
883893 .family = PF_CAN,
884894 .release = raw_release,
....@@ -888,7 +898,8 @@
888898 .accept = sock_no_accept,
889899 .getname = raw_getname,
890900 .poll = datagram_poll,
891
- .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */
901
+ .ioctl = raw_sock_no_ioctlcmd,
902
+ .gettstamp = sock_gettstamp,
892903 .listen = sock_no_listen,
893904 .shutdown = sock_no_shutdown,
894905 .setsockopt = raw_setsockopt,
....@@ -921,11 +932,11 @@
921932 {
922933 int err;
923934
924
- pr_info("can: raw protocol (rev " CAN_RAW_VERSION ")\n");
935
+ pr_info("can: raw protocol\n");
925936
926937 err = can_proto_register(&raw_can_proto);
927938 if (err < 0)
928
- printk(KERN_ERR "can: registration of raw protocol failed\n");
939
+ pr_err("can: registration of raw protocol failed\n");
929940 else
930941 register_netdevice_notifier(&canraw_notifier);
931942