aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Lüssing <linus.luessing@c0d3.blue>2018-06-06 18:46:24 -0400
committerSimon Wunderlich <sw@simonwunderlich.de>2018-06-23 04:29:33 -0400
commita44ebeff6bbd6ef50db41b4195fca87b21aefd20 (patch)
tree68df76321df2daf3e2a484bbb452ab5860c7f997
parent4a519b83da16927fb98fd32b0f598e639d1f1859 (diff)
batman-adv: Fix multicast TT issues with bogus ROAM flags
When a (broken) node wrongly sends multicast TT entries with a ROAM flag then this causes any receiving node to drop all entries for the same multicast MAC address announced by other nodes, leading to packet loss. Fix this DoS vector by only storing TT sync flags. For multicast TT non-sync'ing flag bits like ROAM are unused so far anyway. Fixes: 1d8ab8d3c176 ("batman-adv: Modified forwarding behaviour for multicast packets") Reported-by: Leonardo Mörlein <me@irrelefant.net> Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
-rw-r--r--net/batman-adv/translation-table.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 61ce300091f3..12a2b7d21376 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -1705,7 +1705,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
1705 ether_addr_copy(common->addr, tt_addr); 1705 ether_addr_copy(common->addr, tt_addr);
1706 common->vid = vid; 1706 common->vid = vid;
1707 1707
1708 common->flags = flags & (~BATADV_TT_SYNC_MASK); 1708 if (!is_multicast_ether_addr(common->addr))
1709 common->flags = flags & (~BATADV_TT_SYNC_MASK);
1709 1710
1710 tt_global_entry->roam_at = 0; 1711 tt_global_entry->roam_at = 0;
1711 /* node must store current time in case of roaming. This is 1712 /* node must store current time in case of roaming. This is
@@ -1769,7 +1770,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
1769 * TT_CLIENT_TEMP, therefore they have to be copied in the 1770 * TT_CLIENT_TEMP, therefore they have to be copied in the
1770 * client entry 1771 * client entry
1771 */ 1772 */
1772 common->flags |= flags & (~BATADV_TT_SYNC_MASK); 1773 if (!is_multicast_ether_addr(common->addr))
1774 common->flags |= flags & (~BATADV_TT_SYNC_MASK);
1773 1775
1774 /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only 1776 /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
1775 * one originator left in the list and we previously received a 1777 * one originator left in the list and we previously received a