| Submitter | stephen hemminger |
|---|---|
| Date | Aug. 14, 2012, 3:19 p.m. |
| Message ID | <20120814081933.30f3e868@nehalam.linuxnetplumber.net> |
| Download | mbox | patch |
| Permalink | /patch/177344/ |
| State | Not Applicable |
| Headers | show |
Comments
From: Stephen Hemminger <shemminger@vyatta.com> Date: Tue, 14 Aug 2012 08:19:33 -0700 > Alternative solution for problem found by Linux Driver Verification > project (linuxtesting.org). > > As it noted in the comment before the br_handle_frame_finish > function, this function should be called under rcu_read_lock. > > The problem callgraph: > br_dev_xmit -> br_nf_pre_routing_finish_bridge_slow -> > -> br_handle_frame_finish -> br_port_get_rcu -> rcu_dereference > > And in this case there is no read-lock section. > > Reported-by: Denis Efremov <yefremov.denis@gmail.com> > Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Applied, thanks Stephen. Please CC: this to netdev next time. It's in a grey area whether I or the netfilter folks should apply this one, and here I'm deciding to take care of it. -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Patch
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 3334845..8a3b50f 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -31,9 +31,11 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) struct net_bridge_mdb_entry *mdst; struct br_cpu_netstats *brstats = this_cpu_ptr(br->stats); + rcu_read_lock(); #ifdef CONFIG_BRIDGE_NETFILTER if (skb->nf_bridge && (skb->nf_bridge->mask & BRNF_BRIDGED_DNAT)) { br_nf_pre_routing_finish_bridge_slow(skb); + rcu_read_unlock(); return NETDEV_TX_OK; } #endif @@ -48,7 +50,6 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) skb_reset_mac_header(skb); skb_pull(skb, ETH_HLEN); - rcu_read_lock(); if (is_broadcast_ether_addr(dest)) br_flood_deliver(br, skb); else if (is_multicast_ether_addr(dest)) {
Alternative solution for problem found by Linux Driver Verification project (linuxtesting.org). As it noted in the comment before the br_handle_frame_finish function, this function should be called under rcu_read_lock. The problem callgraph: br_dev_xmit -> br_nf_pre_routing_finish_bridge_slow -> -> br_handle_frame_finish -> br_port_get_rcu -> rcu_dereference And in this case there is no read-lock section. Reported-by: Denis Efremov <yefremov.denis@gmail.com> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> --- net/bridge/br_device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)