]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/bridge/br_fdb.c
bridge: fix RCU races with bridge port
[net-next-2.6.git] / net / bridge / br_fdb.c
index 90512ccfd3e973c19adade047de7eda77ffd2963..2872393b2939556d1492f195dd6e5247deafcb75 100644 (file)
@@ -238,15 +238,18 @@ struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
 int br_fdb_test_addr(struct net_device *dev, unsigned char *addr)
 {
        struct net_bridge_fdb_entry *fdb;
+       struct net_bridge_port *port;
        int ret;
 
-       if (!br_port_exists(dev))
-               return 0;
-
        rcu_read_lock();
-       fdb = __br_fdb_get(br_port_get_rcu(dev)->br, addr);
-       ret = fdb && fdb->dst->dev != dev &&
-               fdb->dst->state == BR_STATE_FORWARDING;
+       port = br_port_get_rcu(dev);
+       if (!port)
+               ret = 0;
+       else {
+               fdb = __br_fdb_get(port->br, addr);
+               ret = fdb && fdb->dst->dev != dev &&
+                       fdb->dst->state == BR_STATE_FORWARDING;
+       }
        rcu_read_unlock();
 
        return ret;