|
@@ -651,12 +651,16 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
|
struct can_frame *cf = (struct can_frame *)skb->data;
|
|
|
int matches;
|
|
|
|
|
|
- if (dev->type != ARPHRD_CAN || !net_eq(dev_net(dev), &init_net)) {
|
|
|
- kfree_skb(skb);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ if (!net_eq(dev_net(dev), &init_net))
|
|
|
+ goto drop;
|
|
|
|
|
|
- BUG_ON(skb->len != sizeof(struct can_frame) || cf->can_dlc > 8);
|
|
|
+ if (WARN_ONCE(dev->type != ARPHRD_CAN ||
|
|
|
+ skb->len != sizeof(struct can_frame) ||
|
|
|
+ cf->can_dlc > 8,
|
|
|
+ "PF_CAN: dropped non conform skbuf: "
|
|
|
+ "dev type %d, len %d, can_dlc %d\n",
|
|
|
+ dev->type, skb->len, cf->can_dlc))
|
|
|
+ goto drop;
|
|
|
|
|
|
/* update statistics */
|
|
|
can_stats.rx_frames++;
|
|
@@ -683,6 +687,10 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+drop:
|
|
|
+ kfree_skb(skb);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|