aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/main.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2008-05-04 20:59:30 -0400
committerDavid S. Miller <davem@davemloft.net>2008-05-04 20:59:30 -0400
commit339a7c41c913035bf58579f6e47b4ba29da83795 (patch)
treeef9c696d9d73f34f75c3470c0a1997964b2256eb /net/mac80211/main.c
parente340a90e6e07bba6e6b3fc39dd5fa76f95579d7c (diff)
mac80211: Do not free net device after it is unregistered.
The error path in ieee80211_register_hw() may call the unregister_netdev() and right after it - the free_netdev(), which is wrong, since the unregister releases the device itself. So the proposed fix is to NULL the local->mdev after unregister is done and check this before calling free_netdev(). I checked - no code uses the local->mdev after unregister in this error path (but even if some did this would be a BUG). Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r--net/mac80211/main.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 9ad4e3631b6b..915afadb0602 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -1766,6 +1766,7 @@ fail_wep:
1766fail_rate: 1766fail_rate:
1767 ieee80211_debugfs_remove_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev)); 1767 ieee80211_debugfs_remove_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev));
1768 unregister_netdevice(local->mdev); 1768 unregister_netdevice(local->mdev);
1769 local->mdev = NULL;
1769fail_dev: 1770fail_dev:
1770 rtnl_unlock(); 1771 rtnl_unlock();
1771 sta_info_stop(local); 1772 sta_info_stop(local);
@@ -1773,8 +1774,10 @@ fail_sta_info:
1773 debugfs_hw_del(local); 1774 debugfs_hw_del(local);
1774 destroy_workqueue(local->hw.workqueue); 1775 destroy_workqueue(local->hw.workqueue);
1775fail_workqueue: 1776fail_workqueue:
1776 ieee80211_if_free(local->mdev); 1777 if (local->mdev != NULL) {
1777 local->mdev = NULL; 1778 ieee80211_if_free(local->mdev);
1779 local->mdev = NULL;
1780 }
1778fail_mdev_alloc: 1781fail_mdev_alloc:
1779 wiphy_unregister(local->hw.wiphy); 1782 wiphy_unregister(local->hw.wiphy);
1780 return result; 1783 return result;