mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
net: fix creation adjacent device symlinks
__netdev_adjacent_dev_insert may add adjust device of different net namespace, without proper check it leads to emergence of broken sysfs links from/to devices in another namespace. Fix: rewrite netdev_adjacent_is_neigh_list macro as a function, move net_eq check into netdev_adjacent_is_neigh_list. (thanks David) related to: 4c75431ac3520631f1d9e74aa88407e6374dbbc4 Signed-off-by: Alexander Fomichev <git.user@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
95e8b10393
commit
7ce64c79c4
@ -4809,9 +4809,14 @@ static void netdev_adjacent_sysfs_del(struct net_device *dev,
|
||||
sysfs_remove_link(&(dev->dev.kobj), linkname);
|
||||
}
|
||||
|
||||
#define netdev_adjacent_is_neigh_list(dev, dev_list) \
|
||||
(dev_list == &dev->adj_list.upper || \
|
||||
dev_list == &dev->adj_list.lower)
|
||||
static inline bool netdev_adjacent_is_neigh_list(struct net_device *dev,
|
||||
struct net_device *adj_dev,
|
||||
struct list_head *dev_list)
|
||||
{
|
||||
return (dev_list == &dev->adj_list.upper ||
|
||||
dev_list == &dev->adj_list.lower) &&
|
||||
net_eq(dev_net(dev), dev_net(adj_dev));
|
||||
}
|
||||
|
||||
static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
struct net_device *adj_dev,
|
||||
@ -4841,7 +4846,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
pr_debug("dev_hold for %s, because of link added from %s to %s\n",
|
||||
adj_dev->name, dev->name, adj_dev->name);
|
||||
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list)) {
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) {
|
||||
ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list);
|
||||
if (ret)
|
||||
goto free_adj;
|
||||
@ -4862,7 +4867,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
|
||||
return 0;
|
||||
|
||||
remove_symlinks:
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list))
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list))
|
||||
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
|
||||
free_adj:
|
||||
kfree(adj);
|
||||
@ -4895,8 +4900,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
|
||||
if (adj->master)
|
||||
sysfs_remove_link(&(dev->dev.kobj), "master");
|
||||
|
||||
if (netdev_adjacent_is_neigh_list(dev, dev_list) &&
|
||||
net_eq(dev_net(dev),dev_net(adj_dev)))
|
||||
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list))
|
||||
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
|
||||
|
||||
list_del_rcu(&adj->list);
|
||||
|
Loading…
x
Reference in New Issue
Block a user