diff options
Diffstat (limited to 'net/can/raw.c')
-rw-r--r-- | net/can/raw.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/can/raw.c b/net/can/raw.c index 1051eee82581..3aab7664933f 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -745,18 +745,19 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
745 | } else | 745 | } else |
746 | ifindex = ro->ifindex; | 746 | ifindex = ro->ifindex; |
747 | 747 | ||
748 | if (ro->fd_frames) { | 748 | dev = dev_get_by_index(sock_net(sk), ifindex); |
749 | if (!dev) | ||
750 | return -ENXIO; | ||
751 | |||
752 | err = -EINVAL; | ||
753 | if (ro->fd_frames && dev->mtu == CANFD_MTU) { | ||
749 | if (unlikely(size != CANFD_MTU && size != CAN_MTU)) | 754 | if (unlikely(size != CANFD_MTU && size != CAN_MTU)) |
750 | return -EINVAL; | 755 | goto put_dev; |
751 | } else { | 756 | } else { |
752 | if (unlikely(size != CAN_MTU)) | 757 | if (unlikely(size != CAN_MTU)) |
753 | return -EINVAL; | 758 | goto put_dev; |
754 | } | 759 | } |
755 | 760 | ||
756 | dev = dev_get_by_index(sock_net(sk), ifindex); | ||
757 | if (!dev) | ||
758 | return -ENXIO; | ||
759 | |||
760 | skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv), | 761 | skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv), |
761 | msg->msg_flags & MSG_DONTWAIT, &err); | 762 | msg->msg_flags & MSG_DONTWAIT, &err); |
762 | if (!skb) | 763 | if (!skb) |