| From: Oliver Hartkopp <socketcan@hartkopp.net> |
| Date: Mon, 23 Feb 2015 20:37:54 +0100 |
| Subject: can: add missing initialisations in CAN related skbuffs |
| |
| commit 969439016d2cf61fef53a973d7e6d2061c3793b1 upstream. |
| |
| When accessing CAN network interfaces with AF_PACKET sockets e.g. by dhclient |
| this can lead to a skb_under_panic due to missing skb initialisations. |
| |
| Add the missing initialisations at the CAN skbuff creation times on driver |
| level (rx path) and in the network layer (tx path). |
| |
| Reported-by: Austin Schuh <austin@peloton-tech.com> |
| Reported-by: Daniel Steer <daniel.steer@mclaren.com> |
| Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> |
| Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> |
| [bwh: Backported to 3.2: |
| - Adjust context |
| - Drop changes to alloc_canfd_skb()] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| --- a/drivers/net/can/dev.c |
| +++ b/drivers/net/can/dev.c |
| @@ -468,6 +468,11 @@ struct sk_buff *alloc_can_skb(struct net |
| skb->protocol = htons(ETH_P_CAN); |
| skb->pkt_type = PACKET_BROADCAST; |
| skb->ip_summed = CHECKSUM_UNNECESSARY; |
| + |
| + skb_reset_mac_header(skb); |
| + skb_reset_network_header(skb); |
| + skb_reset_transport_header(skb); |
| + |
| *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); |
| memset(*cf, 0, sizeof(struct can_frame)); |
| |
| --- a/net/can/af_can.c |
| +++ b/net/can/af_can.c |
| @@ -244,6 +244,9 @@ int can_send(struct sk_buff *skb, int lo |
| } |
| |
| skb->protocol = htons(ETH_P_CAN); |
| + skb->ip_summed = CHECKSUM_UNNECESSARY; |
| + |
| + skb_reset_mac_header(skb); |
| skb_reset_network_header(skb); |
| skb_reset_transport_header(skb); |
| |