Commit 7f988eab authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

[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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7ce1b0ed
...@@ -839,8 +839,12 @@ int dev_change_name(struct net_device *dev, char *newname) ...@@ -839,8 +839,12 @@ int dev_change_name(struct net_device *dev, char *newname)
strlcpy(dev->name, newname, IFNAMSIZ); strlcpy(dev->name, newname, IFNAMSIZ);
device_rename(&dev->dev, dev->name); device_rename(&dev->dev, dev->name);
write_lock_bh(&dev_base_lock);
hlist_del(&dev->name_hlist); hlist_del(&dev->name_hlist);
hlist_add_head(&dev->name_hlist, dev_name_hash(dev->name)); 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); raw_notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment