bonding: fix a race condition in calls to slave MII ioctls
In mii monitor mode, bond_check_dev_link() calls the the ioctl handler of slave devices. It stores the ndo_do_ioctl function pointer to a static (!) ioctl variable and later uses it to call the handler with the IOCTL macro. If another thread executes bond_check_dev_link() at the same time (even with a different bond, which none of the locks prevent), a race condition occurs. If the two racing slaves have different drivers, this may result in one driver's ioctl handler being called with a pointer to a net_device controlled with a different driver, resulting in unpredictable breakage. Unless I am overlooking something, the "static" must be a copy'n'paste error (?). Signed-off-by: Jiri Bohac <jbohac@suse.cz> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
03f191bab7
commit
d9d5283228
@@ -691,7 +691,7 @@ static int bond_check_dev_link(struct bonding *bond,
|
|||||||
struct net_device *slave_dev, int reporting)
|
struct net_device *slave_dev, int reporting)
|
||||||
{
|
{
|
||||||
const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
|
const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
|
||||||
static int (*ioctl)(struct net_device *, struct ifreq *, int);
|
int (*ioctl)(struct net_device *, struct ifreq *, int);
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
struct mii_ioctl_data *mii;
|
struct mii_ioctl_data *mii;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user