aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Eckelmann <sven@narfation.org>2018-06-01 13:24:23 -0400
committerSimon Wunderlich <sw@simonwunderlich.de>2018-06-23 04:29:33 -0400
commit36dc621ceca1be3ec885aeade5fdafbbcc452a6d (patch)
tree05814961975fcf90b37f0f197440ba5dd315700e
parent9713cb0cf19f1cec6c007e3b37be0697042b6720 (diff)
batman-adv: Fix debugfs path for renamed hardif
batman-adv is creating special debugfs directories in the init net_namespace for each valid hard-interface (net_device). But it is possible to rename a net_device to a completely different name then the original one. It can therefore happen that a user registers a new net_device which gets the name "wlan0" assigned by default. batman-adv is also adding a new directory under $debugfs/batman-adv/ with the name "wlan0". The user then decides to rename this device to "wl_pri" and registers a different device. The kernel may now decide to use the name "wlan0" again for this new device. batman-adv will detect it as a valid net_device and tries to create a directory with the name "wlan0" under $debugfs/batman-adv/. But there already exists one with this name under this path and thus this fails. batman-adv will detect a problem and rollback the registering of this device. batman-adv must therefore take care of renaming the debugfs directories for hard-interfaces whenever it detects such a net_device rename. Fixes: 5bc7c1eb44f2 ("batman-adv: add debugfs structure for information per interface") Reported-by: John Soros <sorosj@gmail.com> Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
-rw-r--r--net/batman-adv/debugfs.c20
-rw-r--r--net/batman-adv/debugfs.h6
-rw-r--r--net/batman-adv/hard-interface.c3
3 files changed, 29 insertions, 0 deletions
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
index 4229b01ac7b5..7e5de7b9f6d5 100644
--- a/net/batman-adv/debugfs.c
+++ b/net/batman-adv/debugfs.c
@@ -19,6 +19,7 @@
19#include "debugfs.h" 19#include "debugfs.h"
20#include "main.h" 20#include "main.h"
21 21
22#include <linux/dcache.h>
22#include <linux/debugfs.h> 23#include <linux/debugfs.h>
23#include <linux/err.h> 24#include <linux/err.h>
24#include <linux/errno.h> 25#include <linux/errno.h>
@@ -344,6 +345,25 @@ out:
344} 345}
345 346
346/** 347/**
348 * batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
349 * @hard_iface: hard interface which was renamed
350 */
351void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
352{
353 const char *name = hard_iface->net_dev->name;
354 struct dentry *dir;
355 struct dentry *d;
356
357 dir = hard_iface->debug_dir;
358 if (!dir)
359 return;
360
361 d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
362 if (!d)
363 pr_err("Can't rename debugfs dir to %s\n", name);
364}
365
366/**
347 * batadv_debugfs_del_hardif() - delete the base directory for a hard interface 367 * batadv_debugfs_del_hardif() - delete the base directory for a hard interface
348 * in debugfs. 368 * in debugfs.
349 * @hard_iface: hard interface which is deleted. 369 * @hard_iface: hard interface which is deleted.
diff --git a/net/batman-adv/debugfs.h b/net/batman-adv/debugfs.h
index 37b069698b04..8538a7a75e93 100644
--- a/net/batman-adv/debugfs.h
+++ b/net/batman-adv/debugfs.h
@@ -32,6 +32,7 @@ void batadv_debugfs_destroy(void);
32int batadv_debugfs_add_meshif(struct net_device *dev); 32int batadv_debugfs_add_meshif(struct net_device *dev);
33void batadv_debugfs_del_meshif(struct net_device *dev); 33void batadv_debugfs_del_meshif(struct net_device *dev);
34int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface); 34int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
35void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
35void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface); 36void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface);
36 37
37#else 38#else
@@ -60,6 +61,11 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
60} 61}
61 62
62static inline 63static inline
64void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
65{
66}
67
68static inline
63void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface) 69void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
64{ 70{
65} 71}
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index c405d15befd6..dc2763b11107 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -1051,6 +1051,9 @@ static int batadv_hard_if_event(struct notifier_block *this,
1051 if (batadv_is_wifi_hardif(hard_iface)) 1051 if (batadv_is_wifi_hardif(hard_iface))
1052 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; 1052 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
1053 break; 1053 break;
1054 case NETDEV_CHANGENAME:
1055 batadv_debugfs_rename_hardif(hard_iface);
1056 break;
1054 default: 1057 default:
1055 break; 1058 break;
1056 } 1059 }