diff mbox series

[PATCHv2,net] team: fix possible recursive locking when add slaves

Message ID 20190419063100.5224-1-liuhangbin@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series [PATCHv2,net] team: fix possible recursive locking when add slaves | expand

Commit Message

Hangbin Liu April 19, 2019, 6:31 a.m. UTC
If we add a bond device which is already the master of the team interface,
we will hold the team->lock in team_add_slave() first and then request the
lock in team_set_mac_address() again. The functions are called like:

- team_add_slave()
 - team_port_add()
   - team_port_enter()
     - team_modeop_port_enter()
       - __set_port_dev_addr()
         - dev_set_mac_address()
           - bond_set_mac_address()
             - dev_set_mac_address()
  	       - team_set_mac_address

Although team_upper_dev_link() would check the upper devices but it is
called too late. Fix it by adding a checking before processing the slave.

v2: Do not split the string in netdev_err()

Fixes: 3d249d4ca7d0 ("net: introduce ethernet teaming device")
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
---
 drivers/net/team/team.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

David Miller April 19, 2019, 9:58 p.m. UTC | #1
From: Hangbin Liu <liuhangbin@gmail.com>
Date: Fri, 19 Apr 2019 14:31:00 +0800

> If we add a bond device which is already the master of the team interface,
> we will hold the team->lock in team_add_slave() first and then request the
> lock in team_set_mac_address() again. The functions are called like:
> 
> - team_add_slave()
>  - team_port_add()
>    - team_port_enter()
>      - team_modeop_port_enter()
>        - __set_port_dev_addr()
>          - dev_set_mac_address()
>            - bond_set_mac_address()
>              - dev_set_mac_address()
>   	       - team_set_mac_address
> 
> Although team_upper_dev_link() would check the upper devices but it is
> called too late. Fix it by adding a checking before processing the slave.
> 
> v2: Do not split the string in netdev_err()
> 
> Fixes: 3d249d4ca7d0 ("net: introduce ethernet teaming device")
> Acked-by: Jiri Pirko <jiri@mellanox.com>
> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>

Applied and queued up for -stable, thanks.
diff mbox series

Patch

diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 9ce61b019aad..16963f7a88f7 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -1156,6 +1156,13 @@  static int team_port_add(struct team *team, struct net_device *port_dev,
 		return -EINVAL;
 	}
 
+	if (netdev_has_upper_dev(dev, port_dev)) {
+		NL_SET_ERR_MSG(extack, "Device is already an upper device of the team interface");
+		netdev_err(dev, "Device %s is already an upper device of the team interface\n",
+			   portname);
+		return -EBUSY;
+	}
+
 	if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
 	    vlan_uses_dev(dev)) {
 		NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up");