linux/net/bridge
Nikolay Aleksandrov 0a2628b842 net: bridge: fix old ioctl unlocked net device walk
[ Upstream commit 31ca0458a6 ]

get_bridge_ifindices() is used from the old "deviceless" bridge ioctl
calls which aren't called with rtnl held. The comment above says that it is
called with rtnl but that is not really the case.
Here's a sample output from a test ASSERT_RTNL() which I put in
get_bridge_ifindices and executed "brctl show":
[  957.422726] RTNL: assertion failed at net/bridge//br_ioctl.c (30)
[  957.422925] CPU: 0 PID: 1862 Comm: brctl Tainted: G        W  O
4.6.0-rc4+ #157
[  957.423009] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
BIOS 1.8.1-20150318_183358- 04/01/2014
[  957.423009]  0000000000000000 ffff880058adfdf0 ffffffff8138dec5
0000000000000400
[  957.423009]  ffffffff81ce8380 ffff880058adfe58 ffffffffa05ead32
0000000000000001
[  957.423009]  00007ffec1a444b0 0000000000000400 ffff880053c19130
0000000000008940
[  957.423009] Call Trace:
[  957.423009]  [<ffffffff8138dec5>] dump_stack+0x85/0xc0
[  957.423009]  [<ffffffffa05ead32>]
br_ioctl_deviceless_stub+0x212/0x2e0 [bridge]
[  957.423009]  [<ffffffff81515beb>] sock_ioctl+0x22b/0x290
[  957.423009]  [<ffffffff8126ba75>] do_vfs_ioctl+0x95/0x700
[  957.423009]  [<ffffffff8126c159>] SyS_ioctl+0x79/0x90
[  957.423009]  [<ffffffff8163a4c0>] entry_SYSCALL_64_fastpath+0x23/0xc1

Since it only reads bridge ifindices, we can use rcu to safely walk the net
device list. Also remove the wrong rtnl comment above.

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2017-03-16 02:27:17 +00:00
..
netfilter Revert "netfilter: ensure number of counters is >0 in do_replace()" 2016-08-22 22:38:31 +01:00
br.c bridge: make br_device_notifier static 2014-05-22 15:33:47 -04:00
br_device.c bridge: fix lockdep addr_list_lock false positive splat 2016-02-02 23:47:24 +00:00
br_fdb.c bridge: disable softirqs around br_fdb_update to avoid lockup 2015-06-12 13:40:05 +01:00
br_forward.c bridge: use is_skb_forwardable in forward path 2014-03-31 16:04:04 -04:00
br_if.c bridge: Fix incorrect judgment of promisc 2014-06-05 15:20:31 -07:00
br_input.c bridge: Prepare for forwarding another bridge group addresses 2014-06-11 15:22:53 -07:00
br_ioctl.c net: bridge: fix old ioctl unlocked net device walk 2017-03-16 02:27:17 +00:00
br_mdb.c bridge: mdb: fix delmdb state in the notification 2015-08-25 10:13:53 +01:00
br_multicast.c bridge: multicast: restore perm router ports on multicast enable 2017-02-23 03:54:17 +00:00
br_netfilter.c vlan: rename __vlan_find_dev_deep() to __vlan_find_dev_deep_rcu() 2014-05-12 14:39:13 -04:00
br_netlink.c bridge: Keep track of ports capable of automatic discovery. 2014-05-16 17:06:33 -04:00
br_private.h Bridge: Fix ipv6 mc snooping if bridge has no ipv6 address 2016-08-22 22:38:23 +01:00
br_private_stp.h net: 8021q/bluetooth/bridge/can/ceph: Remove extern from function prototypes 2013-10-19 19:12:11 -04:00
br_stp.c bridge: Clamp forward_delay when enabling STP 2013-09-12 23:32:14 -04:00
br_stp_bpdu.c br: fix use of ->rx_handler_data in code executed on non-rx_handler path 2013-12-06 15:41:40 -05:00
br_stp_if.c bridge: Only call /sbin/bridge-stp for the initial network namespace 2016-01-28 10:27:12 +00:00
br_stp_timer.c bridge: add space before '(/{', after ',', etc. 2013-12-19 19:27:26 -05:00
br_sysfs_br.c bridge: Support 802.1ad vlan filtering 2014-06-11 15:22:53 -07:00
br_sysfs_if.c bridge: Keep track of ports capable of automatic discovery. 2014-05-16 17:06:33 -04:00
br_vlan.c bridge: Fix br_should_learn to check vlan_enabled 2014-10-15 12:05:28 +02:00
Kconfig bridge: Add vlan filtering infrastructure 2013-02-13 19:41:46 -05:00
Makefile netfilter: bridge: fix Kconfig unmet dependencies 2014-05-26 00:42:30 -04:00