|
@@ -408,11 +408,17 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|
|
*/
|
|
|
nf_reset(skb);
|
|
|
|
|
|
+ if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
|
|
|
+ goto dropped;
|
|
|
+
|
|
|
vid = batadv_get_vid(skb, 0);
|
|
|
ethhdr = eth_hdr(skb);
|
|
|
|
|
|
switch (ntohs(ethhdr->h_proto)) {
|
|
|
case ETH_P_8021Q:
|
|
|
+ if (!pskb_may_pull(skb, VLAN_ETH_HLEN))
|
|
|
+ goto dropped;
|
|
|
+
|
|
|
vhdr = (struct vlan_ethhdr *)skb->data;
|
|
|
|
|
|
if (vhdr->h_vlan_encapsulated_proto != ethertype)
|
|
@@ -424,8 +430,6 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|
|
}
|
|
|
|
|
|
/* skb->dev & skb->pkt_type are set here */
|
|
|
- if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
|
|
|
- goto dropped;
|
|
|
skb->protocol = eth_type_trans(skb, soft_iface);
|
|
|
|
|
|
/* should not be necessary anymore as we use skb_pull_rcsum()
|