diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-05-04 20:59:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-05-04 20:59:30 -0400 |
commit | 339a7c41c913035bf58579f6e47b4ba29da83795 (patch) | |
tree | ef9c696d9d73f34f75c3470c0a1997964b2256eb /net/mac80211 | |
parent | e340a90e6e07bba6e6b3fc39dd5fa76f95579d7c (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')
-rw-r--r-- | net/mac80211/main.c | 7 |
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: | |||
1766 | fail_rate: | 1766 | fail_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; | ||
1769 | fail_dev: | 1770 | fail_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); |
1775 | fail_workqueue: | 1776 | fail_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 | } | ||
1778 | fail_mdev_alloc: | 1781 | fail_mdev_alloc: |
1779 | wiphy_unregister(local->hw.wiphy); | 1782 | wiphy_unregister(local->hw.wiphy); |
1780 | return result; | 1783 | return result; |