[source] ath9k: fix sta initialization bug leading to stability issues

LEDE Commits lede-commits at lists.infradead.org
Tue Aug 2 04:08:23 PDT 2016


nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/?p=source.git;a=commitdiff;h=18373e24cfa118044a23e88b4374f6a42f8002ac

commit 18373e24cfa118044a23e88b4374f6a42f8002ac
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Tue Aug 2 13:07:46 2016 +0200

    ath9k: fix sta initialization bug leading to stability issues
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 ...using-sta-drv_priv-before-initializing-it.patch | 33 ++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch b/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch
new file mode 100644
index 0000000..aaa6706
--- /dev/null
+++ b/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch
@@ -0,0 +1,33 @@
+From: Felix Fietkau <nbd at nbd.name>
+Date: Tue, 2 Aug 2016 13:00:01 +0200
+Subject: [PATCH] ath9k: fix using sta->drv_priv before initializing it
+
+A station pointer can be passed to the driver on tx, before it has been
+marked as associated. Since ath9k_sta_state was initializing the entry
+too late, it resulted in some spurious crashes.
+
+Fixes: df3c6eb34da5 ("ath9k: Use sta_state() callback")
+Cc: stable at vger.kernel.org
+Signed-off-by: Felix Fietkau <nbd at nbd.name>
+---
+
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -1563,13 +1563,13 @@ static int ath9k_sta_state(struct ieee80
+ 	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
+ 	int ret = 0;
+ 
+-	if (old_state == IEEE80211_STA_AUTH &&
+-	    new_state == IEEE80211_STA_ASSOC) {
++	if (old_state == IEEE80211_STA_NOTEXIST &&
++	    new_state == IEEE80211_STA_NONE) {
+ 		ret = ath9k_sta_add(hw, vif, sta);
+ 		ath_dbg(common, CONFIG,
+ 			"Add station: %pM\n", sta->addr);
+-	} else if (old_state == IEEE80211_STA_ASSOC &&
+-		   new_state == IEEE80211_STA_AUTH) {
++	} else if (old_state == IEEE80211_STA_NONE &&
++		   new_state == IEEE80211_STA_NOTEXIST) {
+ 		ret = ath9k_sta_remove(hw, vif, sta);
+ 		ath_dbg(common, CONFIG,
+ 			"Remove station: %pM\n", sta->addr);



More information about the lede-commits mailing list