mac80211: Fix debugfs union misuse and pointer corruption
authorJouni Malinen <jouni.malinen@atheros.com>
Thu, 28 Aug 2008 12:12:06 +0000 (15:12 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 2 Sep 2008 21:39:50 +0000 (17:39 -0400)
debugfs union in struct ieee80211_sub_if_data is misused by including a
common default_key dentry as a union member. This ends occupying the same
memory area with the first dentry in other union members (structures;
usually drop_unencrypted). Consequently, debugfs operations on
default_key symlinks and drop_unencrypted entry are using the same
dentry pointer even though they are supposed to be separate ones. This
can lead to removing entries incorrectly or potentially leaving
something behind since one of the dentry pointers gets lost.

Fix this by moving the default_key dentry to a new struct
(common_debugfs) that contains dentries (more to be added in future)
that are shared by all vif types. The debugfs union must only be used
for vif type-specific entries to avoid this type of pointer corruption.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs_key.c
net/mac80211/ieee80211_i.h

index 7439b63df5d0b72db616e3cf012e310a9720147c..cf82acec913a235a3e87dc4c7222f344449436bd 100644 (file)
@@ -265,7 +265,7 @@ void ieee80211_debugfs_key_add_default(struct ieee80211_sub_if_data *sdata)
        key = sdata->default_key;
        if (key) {
                sprintf(buf, "../keys/%d", key->debugfs.cnt);
-               sdata->debugfs.default_key =
+               sdata->common_debugfs.default_key =
                        debugfs_create_symlink("default_key",
                                               sdata->debugfsdir, buf);
        } else
@@ -277,8 +277,8 @@ void ieee80211_debugfs_key_remove_default(struct ieee80211_sub_if_data *sdata)
        if (!sdata)
                return;
 
-       debugfs_remove(sdata->debugfs.default_key);
-       sdata->debugfs.default_key = NULL;
+       debugfs_remove(sdata->common_debugfs.default_key);
+       sdata->common_debugfs.default_key = NULL;
 }
 
 void ieee80211_debugfs_key_sta_del(struct ieee80211_key *key,
index 586a9b49b0fc6f345c0db6e73e0d96a5b8dbdfd9..4498d8713652ac5b93c82eb7973d4f8812c2cda0 100644 (file)
@@ -496,8 +496,10 @@ struct ieee80211_sub_if_data {
                struct {
                        struct dentry *mode;
                } monitor;
-               struct dentry *default_key;
        } debugfs;
+       struct {
+               struct dentry *default_key;
+       } common_debugfs;
 
 #ifdef CONFIG_MAC80211_MESH
        struct dentry *mesh_stats_dir;