can: af_can: fix NULL pointer dereference in can_rcv_filter
Subsystems (4)
Oliver Hartkopp
maintainerPATCH v2 1/1 can: af_can: fix NULL pointer dereference in can_rcv_filter
Analogue to commit 8aa59e355949 ("can: af_can: fix NULL pointer dereference in can_rx_register()") we need to check for a missing initialization of ml_priv in the receive path of CAN frames. Since commit 4e096a18867a ("net: introduce CAN specific pointer in the struct net_device") the check for dev->type to be ARPHRD_CAN is not sufficient anymore since bonding or tun netdevices claim to be CAN devices but do not initialize ml_priv accordingly.
Fixes 4e096a18867a ("net: introduce CAN specific pointer in the struct net_device")
Reported-by [email protected]
Reported-by Wei Chen <[email protected]>
Signed-off-by Oliver Hartkopp <[email protected]>
---
V2: fix misspeling detected by checkpatch
net/can/af_can.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
net/can/af_can.c +3 -3
@@ -675,11 +675,11 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev) }static int can_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt,struct net_device *orig_dev) { -if (unlikely (dev->type !=ARPHRD_CAN || (!can_is_can_skb (skb)))) { +if (unlikely (dev->type !=ARPHRD_CAN || !can_get_ml_priv (dev) || !can_is_can_skb (skb))) {pr_warn_once ("PF_CAN: dropped non conform CAN skbuff: dev type %d, len %d\n" , dev->type, skb->len);kfree_skb (skb);return NET_RX_DROP ;
@@ -690,11 +690,11 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev, }static int canfd_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt,struct net_device *orig_dev) { -if (unlikely (dev->type !=ARPHRD_CAN || (!can_is_canfd_skb (skb)))) { +if (unlikely (dev->type !=ARPHRD_CAN || !can_get_ml_priv (dev) || !can_is_canfd_skb (skb))) {pr_warn_once ("PF_CAN: dropped non conform CAN FD skbuff: dev type %d, len %d\n" , dev->type, skb->len);kfree_skb (skb);return NET_RX_DROP ;
@@ -705,11 +705,11 @@ static int canfd_rcv(struct sk_buff *skb, struct net_device *dev, }static int canxl_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt,struct net_device *orig_dev) { -if (unlikely (dev->type !=ARPHRD_CAN || (!can_is_canxl_skb (skb)))) { +if (unlikely (dev->type !=ARPHRD_CAN || !can_get_ml_priv (dev) || !can_is_canxl_skb (skb))) {pr_warn_once ("PF_CAN: dropped non conform CAN XL skbuff: dev type %d, len %d\n" , dev->type, skb->len);kfree_skb (skb);return NET_RX_DROP ;
Signature · 1 line
2.30.2