From: Herbert Xu Date: Mon, 30 Jul 2007 23:35:46 +0000 (-0700) Subject: [NET]: Take dev_base_lock when moving device name hash list entry X-Git-Tag: v2.6.23-rc2~35^2~25 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f988eab57bd22884bbc452fb04c6c18738666b3;p=linux-2.6 [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 Signed-off-by: David S. Miller --- diff --git a/net/core/dev.c b/net/core/dev.c index 7bfea5e903..346cbf6653 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -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;