Skip to contentSkip to conversation

can: Use WARN_ONCE() instead of BUG_ON() for sanity check in receive path

PATCH In review Oliver Hartkopp 2 participants 5 messages Aug 10, 2009 – Aug 14, 2009

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 can: Use WARN_ONCE() instead of BUG_ON() for sanity check in receive path

To ensure a proper handling of CAN frames transported in skbuffs some checks need to be performed at receive time.

As stated by Michael Olbrich and Luotao Fu BUG_ON() might be to restrictive. This is right as we can just drop the non conform skbuff and the Kernel can continue working.

This patch replaces the BUG_ON() with a WARN_ONCE() so that the system remains healthy but we made the problem visible (once).

Additionally it changes the return values to the common NET_RX_xxx constants.

---

net/can/af_can.c +14 -6
index e733725..ef1c43a 100644
@@ -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++;
@@ -682,7 +686,11 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
 		can_stats.matches_delta++;
 	}
 
-	return 0;
+	return NET_RX_SUCCESS;
+
+drop:
+	kfree_skb(skb);
+	return NET_RX_DROP;
 }
 
 /*
maintainer
#1 lore raw

From: Oliver Hartkopp <[email protected]>
Date: Mon, 10 Aug 2009 13:27:09 +0200

Quoted 1 line

Additionally it changes the return values to the common NET_RX_xxx constants.

Don't munge unrelated changes together like this, split it up.

Also, this is not net-2.6 material, I will only apply these changes to net-next-2.6 at this point.

Thanks.

#2 lore raw
Quoted 9 lines · David Miller

From: Oliver Hartkopp <[email protected]>
Date: Mon, 10 Aug 2009 13:27:09 +0200

Quoted 1 line

Additionally it changes the return values to the common NET_RX_xxx constants.

Don't munge unrelated changes together like this, split it up.

Also, this is not net-2.6 material, I will only apply these changes to net-next-2.6 at this point.

No problem.

Btw. this patch was removed from patchwork and i was not able to find it in your latest net-next-2.6 push this morning.

Best regards,
Oliver

maintainer
#3 lore raw

From: Oliver Hartkopp <[email protected]>
Date: Fri, 14 Aug 2009 07:57:02 +0200

Quoted 8 lines
Quoted 7 lines · David Miller

From: Oliver Hartkopp <[email protected]>
Date: Mon, 10 Aug 2009 13:27:09 +0200

Quoted 1 line

Additionally it changes the return values to the common NET_RX_xxx constants.

Don't munge unrelated changes together like this, split it up.

Quoted 7 lines
Quoted 2 lines

Also, this is not net-2.6 material, I will only apply these changes to net-next-2.6 at this point.

No problem.

Btw. this patch was removed from patchwork and i was not able to find it in your latest net-next-2.6 push this morning.

It's not in net-next-2.6 because I didn't apply it, which is pretty clealy implied when I'm asking you to split the change up into multiple patches.

When I ask for changes, I mark the patch in patchwork with the "changes requested" state and expect you to send me new updated stuff.

You can look for patches in various "done" states by simply modifying the "Filters" setting in the patch list.

#4 lore raw
Quoted 12 lines · David Miller

From: Oliver Hartkopp <[email protected]>
Date: Fri, 14 Aug 2009 07:57:02 +0200

Quoted 9 lines
Quoted 8 lines · David Miller

From: Oliver Hartkopp <[email protected]>
Date: Mon, 10 Aug 2009 13:27:09 +0200

Quoted 1 line

Additionally it changes the return values to the common NET_RX_xxx constants.

Don't munge unrelated changes together like this, split it up.

Also, this is not net-2.6 material, I will only apply these changes to net-next-2.6 at this point.

Quoted 8 lines
Quoted 4 lines

No problem.

Btw. this patch was removed from patchwork and i was not able to find it in your latest net-next-2.6 push this morning.

It's not in net-next-2.6 because I didn't apply it, which is pretty clealy implied when I'm asking you to split the change up into multiple patches.

Sorry - i assumed this to be a hint for the next time. My fault.

Quoted 6 lines

When I ask for changes, I mark the patch in patchwork with the "changes requested" state and expect you to send me new updated stuff.

You can look for patches in various "done" states by simply modifying the "Filters" setting in the patch list.

Ah! I only had the filters on 'action required' and therefore is was not able to see what happened after the patches were removed from the 'action required' view ...

I'll re-send two separate patches for net-next-2.6 .

Thanks,
Oliver