mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
batman-adv: use the proper header len when checking the TTVN
Unicast packet might be of type either UNICAST or UNICAST4ADDR. In the two cases the header size is different, but the mechanism checking the TTVN field was assuming it to be always of the same type (UNICAST), so failing to access the inner Ethernet header in case of UNICAST4ADDR. Fix this by passing the real header length as argument. Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
This commit is contained in:
parent
60d509fa6a
commit
dd981ab091
1 changed files with 5 additions and 6 deletions
|
@ -924,7 +924,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||||
struct sk_buff *skb) {
|
struct sk_buff *skb, int hdr_len) {
|
||||||
uint8_t curr_ttvn, old_ttvn;
|
uint8_t curr_ttvn, old_ttvn;
|
||||||
struct batadv_orig_node *orig_node;
|
struct batadv_orig_node *orig_node;
|
||||||
struct ethhdr *ethhdr;
|
struct ethhdr *ethhdr;
|
||||||
|
@ -933,7 +933,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||||
int is_old_ttvn;
|
int is_old_ttvn;
|
||||||
|
|
||||||
/* check if there is enough data before accessing it */
|
/* check if there is enough data before accessing it */
|
||||||
if (pskb_may_pull(skb, sizeof(*unicast_packet) + ETH_HLEN) < 0)
|
if (pskb_may_pull(skb, hdr_len + ETH_HLEN) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* create a copy of the skb (in case of for re-routing) to modify it. */
|
/* create a copy of the skb (in case of for re-routing) to modify it. */
|
||||||
|
@ -941,7 +941,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||||
ethhdr = (struct ethhdr *)(skb->data + sizeof(*unicast_packet));
|
ethhdr = (struct ethhdr *)(skb->data + hdr_len);
|
||||||
|
|
||||||
/* check if the destination client was served by this node and it is now
|
/* check if the destination client was served by this node and it is now
|
||||||
* roaming. In this case, it means that the node has got a ROAM_ADV
|
* roaming. In this case, it means that the node has got a ROAM_ADV
|
||||||
|
@ -1048,8 +1048,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||||
|
|
||||||
if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
|
if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
|
||||||
return NET_RX_DROP;
|
return NET_RX_DROP;
|
||||||
|
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
|
||||||
if (!batadv_check_unicast_ttvn(bat_priv, skb))
|
|
||||||
return NET_RX_DROP;
|
return NET_RX_DROP;
|
||||||
|
|
||||||
/* packet for me */
|
/* packet for me */
|
||||||
|
@ -1093,7 +1092,7 @@ int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
|
||||||
if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
|
if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
|
||||||
return NET_RX_DROP;
|
return NET_RX_DROP;
|
||||||
|
|
||||||
if (!batadv_check_unicast_ttvn(bat_priv, skb))
|
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
|
||||||
return NET_RX_DROP;
|
return NET_RX_DROP;
|
||||||
|
|
||||||
unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
|
unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
|
||||||
|
|
Loading…
Reference in a new issue