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)  	} else  		ifindex = ro->ifindex; -	if (ro->fd_frames) { +	dev = dev_get_by_index(sock_net(sk), ifindex); +	if (!dev) +		return -ENXIO; + +	err = -EINVAL; +	if (ro->fd_frames && dev->mtu == CANFD_MTU) {  		if (unlikely(size != CANFD_MTU && size != CAN_MTU)) -			return -EINVAL; +			goto put_dev;  	} else {  		if (unlikely(size != CAN_MTU)) -			return -EINVAL; +			goto put_dev;  	} -	dev = dev_get_by_index(sock_net(sk), ifindex); -	if (!dev) -		return -ENXIO; -  	skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),  				  msg->msg_flags & MSG_DONTWAIT, &err);  	if (!skb) | 
