bridge: ignore bogus STP config packets
authorstephen hemminger <shemminger@vyatta.com>
Fri, 22 Jul 2011 07:47:07 +0000 (07:47 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 23 Jul 2011 00:01:12 +0000 (17:01 -0700)
If the message_age is already greater than the max_age, then the
BPDU is bogus. Linux won't generate BPDU, but conformance tester
or buggy implementation might.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_stp_bpdu.c

index 289646e..b69232b 100644 (file)
@@ -210,6 +210,17 @@ void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
                bpdu.hello_time = br_get_ticks(buf+28);
                bpdu.forward_delay = br_get_ticks(buf+30);
 
+               if (bpdu.message_age > bpdu.max_age) {
+                       if (net_ratelimit())
+                               br_notice(p->br,
+                                         "port %u config from %pM"
+                                         " (message_age %ul > max_age %ul)\n",
+                                         p->port_no,
+                                         eth_hdr(skb)->h_source,
+                                         bpdu.message_age, bpdu.max_age);
+                       goto out;
+               }
+
                br_received_config_bpdu(p, &bpdu);
        }