ath10k: unregister spectral before mac
authorSimon Wunderlich <sw@simonwunderlich.de>
Tue, 12 Aug 2014 15:12:17 +0000 (17:12 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 14 Aug 2014 12:42:17 +0000 (15:42 +0300)
If spectral is unregistered after mac80211, the relayfs file has already
been removed recursively by mac/cfg80211, and spectral tries to remove
the file once more, thus leading to double free problems. Better clean
up spectral before to avoid that problem.

Reported-by: Kalle Valo <kvalo@qca.qualcomm.com>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.c

index d3474b43ac474018da987f6c1c914edde96d2940..ba2e87ab19bd4a0757bde47533dbda6e4df5243c 100644 (file)
@@ -1043,6 +1043,12 @@ void ath10k_core_unregister(struct ath10k *ar)
        if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
                return;
 
+       /* Stop spectral before unregistering from mac80211 to remove the
+        * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
+        * would be already be free'd recursively, leading to a double free.
+        */
+       ath10k_spectral_destroy(ar);
+
        /* We must unregister from mac80211 before we stop HTC and HIF.
         * Otherwise we will fail to submit commands to FW and mac80211 will be
         * unhappy about callback failures. */
@@ -1050,8 +1056,6 @@ void ath10k_core_unregister(struct ath10k *ar)
 
        ath10k_core_free_firmware_files(ar);
 
-       ath10k_spectral_destroy(ar);
-
        ath10k_debug_destroy(ar);
 }
 EXPORT_SYMBOL(ath10k_core_unregister);