diff options
Diffstat (limited to 'net/can/raw.c')
-rw-r--r-- | net/can/raw.c | 27 |
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) { |