Commit 20a599be authored by Linus Lüssing's avatar Linus Lüssing Committed by David S. Miller

bridge: multicast: enable snooping on general queries only

Without this check someone could easily create a denial of service
by injecting multicast-specific queries to enable the bridge
snooping part if no real querier issuing periodic general queries
is present on the link which would result in the bridge wrongly
shutting down ports for multicast traffic as the bridge did not learn
about these listeners.

With this patch the snooping code is enabled upon receiving valid,
general queries only.
Signed-off-by: default avatarLinus Lüssing <linus.luessing@web.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9ed973cc
...@@ -1127,9 +1127,10 @@ static void br_multicast_query_received(struct net_bridge *br, ...@@ -1127,9 +1127,10 @@ static void br_multicast_query_received(struct net_bridge *br,
struct net_bridge_port *port, struct net_bridge_port *port,
struct bridge_mcast_querier *querier, struct bridge_mcast_querier *querier,
int saddr, int saddr,
bool is_general_query,
unsigned long max_delay) unsigned long max_delay)
{ {
if (saddr) if (saddr && is_general_query)
br_multicast_update_querier_timer(br, querier, max_delay); br_multicast_update_querier_timer(br, querier, max_delay);
else if (timer_pending(&querier->timer)) else if (timer_pending(&querier->timer))
return; return;
...@@ -1190,7 +1191,7 @@ static int br_ip4_multicast_query(struct net_bridge *br, ...@@ -1190,7 +1191,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
} }
br_multicast_query_received(br, port, &br->ip4_querier, !!iph->saddr, br_multicast_query_received(br, port, &br->ip4_querier, !!iph->saddr,
max_delay); !group, max_delay);
if (!group) if (!group)
goto out; goto out;
...@@ -1282,7 +1283,8 @@ static int br_ip6_multicast_query(struct net_bridge *br, ...@@ -1282,7 +1283,8 @@ static int br_ip6_multicast_query(struct net_bridge *br,
} }
br_multicast_query_received(br, port, &br->ip6_querier, br_multicast_query_received(br, port, &br->ip6_querier,
!ipv6_addr_any(&ip6h->saddr), max_delay); !ipv6_addr_any(&ip6h->saddr),
is_general_query, max_delay);
if (!group) if (!group)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment