mac80211: Fix debugfs file add/del for netdev
authorJouni Malinen <j@w1.fi>
Mon, 25 Aug 2008 08:57:06 +0000 (11:57 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 27 Aug 2008 00:06:33 +0000 (20:06 -0400)
Previous version was using incorrect union structures for non-AP
interfaces when adding and removing max_ratectrl_rateidx and
force_unicast_rateidx entries. Depending on the vif type, this ended
up in corrupting debugfs entries since the dentries inside different
union structures ended up going being on top of eachother.. As the
end result, debugfs files were being left behind with references to
freed data (instant kernel oops on access) and directories were not
removed properly when unloading mac80211 drivers. This patch fixes
those issues by using only a single union structure based on the vif
type.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs_netdev.c
net/mac80211/ieee80211_i.h

index 475f89a8aee109ce243a12869848eb15d270187c..8165df578c92ecf5b29f84b315f0583809ac9840 100644 (file)
@@ -248,8 +248,8 @@ IEEE80211_IF_WFILE(min_discovery_timeout,
 static void add_sta_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_ADD(drop_unencrypted, sta);
-       DEBUGFS_ADD(force_unicast_rateidx, ap);
-       DEBUGFS_ADD(max_ratectrl_rateidx, ap);
+       DEBUGFS_ADD(force_unicast_rateidx, sta);
+       DEBUGFS_ADD(max_ratectrl_rateidx, sta);
 
        DEBUGFS_ADD(state, sta);
        DEBUGFS_ADD(bssid, sta);
@@ -283,8 +283,8 @@ static void add_ap_files(struct ieee80211_sub_if_data *sdata)
 static void add_wds_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_ADD(drop_unencrypted, wds);
-       DEBUGFS_ADD(force_unicast_rateidx, ap);
-       DEBUGFS_ADD(max_ratectrl_rateidx, ap);
+       DEBUGFS_ADD(force_unicast_rateidx, wds);
+       DEBUGFS_ADD(max_ratectrl_rateidx, wds);
 
        DEBUGFS_ADD(peer, wds);
 }
@@ -292,8 +292,8 @@ static void add_wds_files(struct ieee80211_sub_if_data *sdata)
 static void add_vlan_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_ADD(drop_unencrypted, vlan);
-       DEBUGFS_ADD(force_unicast_rateidx, ap);
-       DEBUGFS_ADD(max_ratectrl_rateidx, ap);
+       DEBUGFS_ADD(force_unicast_rateidx, vlan);
+       DEBUGFS_ADD(max_ratectrl_rateidx, vlan);
 }
 
 static void add_monitor_files(struct ieee80211_sub_if_data *sdata)
@@ -381,8 +381,8 @@ static void add_files(struct ieee80211_sub_if_data *sdata)
 static void del_sta_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_DEL(drop_unencrypted, sta);
-       DEBUGFS_DEL(force_unicast_rateidx, ap);
-       DEBUGFS_DEL(max_ratectrl_rateidx, ap);
+       DEBUGFS_DEL(force_unicast_rateidx, sta);
+       DEBUGFS_DEL(max_ratectrl_rateidx, sta);
 
        DEBUGFS_DEL(state, sta);
        DEBUGFS_DEL(bssid, sta);
@@ -416,8 +416,8 @@ static void del_ap_files(struct ieee80211_sub_if_data *sdata)
 static void del_wds_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_DEL(drop_unencrypted, wds);
-       DEBUGFS_DEL(force_unicast_rateidx, ap);
-       DEBUGFS_DEL(max_ratectrl_rateidx, ap);
+       DEBUGFS_DEL(force_unicast_rateidx, wds);
+       DEBUGFS_DEL(max_ratectrl_rateidx, wds);
 
        DEBUGFS_DEL(peer, wds);
 }
@@ -425,8 +425,8 @@ static void del_wds_files(struct ieee80211_sub_if_data *sdata)
 static void del_vlan_files(struct ieee80211_sub_if_data *sdata)
 {
        DEBUGFS_DEL(drop_unencrypted, vlan);
-       DEBUGFS_DEL(force_unicast_rateidx, ap);
-       DEBUGFS_DEL(max_ratectrl_rateidx, ap);
+       DEBUGFS_DEL(force_unicast_rateidx, vlan);
+       DEBUGFS_DEL(max_ratectrl_rateidx, vlan);
 }
 
 static void del_monitor_files(struct ieee80211_sub_if_data *sdata)
index ec59345af65b9bd2f62accd7e23ca511f9d0e3a2..586a9b49b0fc6f345c0db6e73e0d96a5b8dbdfd9 100644 (file)
@@ -470,6 +470,8 @@ struct ieee80211_sub_if_data {
                        struct dentry *auth_transaction;
                        struct dentry *flags;
                        struct dentry *num_beacons_sta;
+                       struct dentry *force_unicast_rateidx;
+                       struct dentry *max_ratectrl_rateidx;
                } sta;
                struct {
                        struct dentry *drop_unencrypted;
@@ -483,9 +485,13 @@ struct ieee80211_sub_if_data {
                struct {
                        struct dentry *drop_unencrypted;
                        struct dentry *peer;
+                       struct dentry *force_unicast_rateidx;
+                       struct dentry *max_ratectrl_rateidx;
                } wds;
                struct {
                        struct dentry *drop_unencrypted;
+                       struct dentry *force_unicast_rateidx;
+                       struct dentry *max_ratectrl_rateidx;
                } vlan;
                struct {
                        struct dentry *mode;