mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 18:19:28 +09:00
batman-adv: Check skb size before using encapsulated ETH+VLAN header
commitc78296665cupstream. The encapsulated ethernet and VLAN header may be outside the received ethernet frame. Thus the skb buffer size has to be checked before it can be parsed to find out if it encapsulates another batman-adv packet. Fixes:420193573f("batman-adv: softif bridge loop avoidance") Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Antonio Quartulli <a@unstable.cc> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f9d4649488
commit
c6865db3a4
@@ -407,11 +407,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)
|
||||
@@ -423,8 +429,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()
|
||||
|
||||
Reference in New Issue
Block a user