forked from Minki/linux
[NET]: Take dev_base_lock when moving device name hash list entry
When we added name-based hashing the dev_base_lock was designated as the lock to take when changing the name hash list. Unfortunately, because it was a preexisting lock that just happened to be taken in the right spots we neglected to take it in dev_change_name. The race can affect calles of __dev_get_by_name that do so without taking the RTNL. They may end up walking down the wrong hash chain and end up missing the device that they're looking for. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7ce1b0edcb
commit
7f988eab57
@ -839,8 +839,12 @@ int dev_change_name(struct net_device *dev, char *newname)
|
||||
strlcpy(dev->name, newname, IFNAMSIZ);
|
||||
|
||||
device_rename(&dev->dev, dev->name);
|
||||
|
||||
write_lock_bh(&dev_base_lock);
|
||||
hlist_del(&dev->name_hlist);
|
||||
hlist_add_head(&dev->name_hlist, dev_name_hash(dev->name));
|
||||
write_unlock_bh(&dev_base_lock);
|
||||
|
||||
raw_notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev);
|
||||
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user