Use RCU macro's to ensure barrier safety on the bridge
receive path.

Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>


--- br-fix.orig/net/bridge/br_if.c
+++ br-fix/net/bridge/br_if.c
@@ -124,7 +124,7 @@ static void del_nbp(struct net_bridge_po
        struct net_bridge *br = p->br;
        struct net_device *dev = p->dev;
 
-       dev->br_port = NULL;
+       rcu_assign_pointer(dev->br_port, NULL);
        dev_set_promiscuity(dev, -1);
 
        cancel_delayed_work(&p->carrier_check);
--- br-fix.orig/net/bridge/br_input.c
+++ br-fix/net/bridge/br_input.c
@@ -45,13 +45,20 @@ static void br_pass_frame_up(struct net_
 int br_handle_frame_finish(struct sk_buff *skb)
 {
        const unsigned char *dest = eth_hdr(skb)->h_dest;
-       struct net_bridge_port *p = skb->dev->br_port;
-       struct net_bridge *br = p->br;
+       struct net_bridge_port *p;
+       struct net_bridge *br;
        struct net_bridge_fdb_entry *dst;
        int passedup = 0;
 
        /* insert into forwarding database after filtering to avoid spoofing */
-       br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
+       p = rcu_dereference(skb->dev->br_port);
+       if (unlikely(!p)) {
+               kfree_skb(skb);
+               goto out;
+       }
+
+       br = p->br;
+       br_fdb_update(br, p, eth_hdr(skb)->h_source);
 
        if (p->state == BR_STATE_LEARNING) {
                kfree_skb(skb);

--
Stephen Hemminger <[EMAIL PROTECTED]>
OSDL http://developer.osdl.org/~shemminger

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to