aboutsummaryrefslogtreecommitdiffstats
path: root/net/can/raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/can/raw.c')
-rw-r--r--net/can/raw.c27
1 files changed, 6 insertions, 21 deletions
diff --git a/net/can/raw.c b/net/can/raw.c
index 07d72d852324..081e81fd017f 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -121,13 +121,9 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
121 if (!ro->recv_own_msgs && oskb->sk == sk) 121 if (!ro->recv_own_msgs && oskb->sk == sk)
122 return; 122 return;
123 123
124 /* do not pass frames with DLC > 8 to a legacy socket */ 124 /* do not pass non-CAN2.0 frames to a legacy socket */
125 if (!ro->fd_frames) { 125 if (!ro->fd_frames && oskb->len != CAN_MTU)
126 struct canfd_frame *cfd = (struct canfd_frame *)oskb->data; 126 return;
127
128 if (unlikely(cfd->len > CAN_MAX_DLEN))
129 return;
130 }
131 127
132 /* clone the given skb to be able to enqueue it into the rcv queue */ 128 /* clone the given skb to be able to enqueue it into the rcv queue */
133 skb = skb_clone(oskb, GFP_ATOMIC); 129 skb = skb_clone(oskb, GFP_ATOMIC);
@@ -715,6 +711,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
715 711
716 skb->dev = dev; 712 skb->dev = dev;
717 skb->sk = sk; 713 skb->sk = sk;
714 skb->priority = sk->sk_priority;
718 715
719 err = can_send(skb, ro->loopback); 716 err = can_send(skb, ro->loopback);
720 717
@@ -737,9 +734,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
737 struct msghdr *msg, size_t size, int flags) 734 struct msghdr *msg, size_t size, int flags)
738{ 735{
739 struct sock *sk = sock->sk; 736 struct sock *sk = sock->sk;
740 struct raw_sock *ro = raw_sk(sk);
741 struct sk_buff *skb; 737 struct sk_buff *skb;
742 int rxmtu;
743 int err = 0; 738 int err = 0;
744 int noblock; 739 int noblock;
745 740
@@ -750,20 +745,10 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
750 if (!skb) 745 if (!skb)
751 return err; 746 return err;
752 747
753 /* 748 if (size < skb->len)
754 * when serving a legacy socket the DLC <= 8 is already checked inside
755 * raw_rcv(). Now check if we need to pass a canfd_frame to a legacy
756 * socket and cut the possible CANFD_MTU/CAN_MTU length to CAN_MTU
757 */
758 if (!ro->fd_frames)
759 rxmtu = CAN_MTU;
760 else
761 rxmtu = skb->len;
762
763 if (size < rxmtu)
764 msg->msg_flags |= MSG_TRUNC; 749 msg->msg_flags |= MSG_TRUNC;
765 else 750 else
766 size = rxmtu; 751 size = skb->len;
767 752
768 err = memcpy_toiovec(msg->msg_iov, skb->data, size); 753 err = memcpy_toiovec(msg->msg_iov, skb->data, size);
769 if (err < 0) { 754 if (err < 0) {