Message ID | 77b76ac8-2bee-6444-d26c-8c30858b8daa@i-love.sakura.ne.jp (mailing list archive) |
---|---|
State | Accepted |
Commit | 8b3046abc99eefe11438090bcc4ec3a3994b55d0 |
Delegated to: | Kalle Valo |
Headers | show |
Series | [1/2,(RESEND)] ath9k_htc: fix NULL pointer dereference at ath9k_htc_rxep() | expand |
Hello, David. I don't know whether these patches can fix all races. But since no response from ath9k maintainers/developers, can you directly pick up these patches via your tree? Regards.
Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> writes: > I don't know whether these patches can fix all races. > But since no response from ath9k maintainers/developers, > can you directly pick up these patches via your tree? Dave, please do not take ath9k patches. It seems that all ath9k syzbot fixes are of questionable quality, and at least some of them have created regressions, so they need to be tested on a real device before I apply them. I asked for help but nobody cared, so I now need to create an ath9k_htc test setup myself and that will take a while. Tetsuo, the patches are on my deferred queue and you can follow the status via patchwork: https://patchwork.kernel.org/project/linux-wireless/list/?series=550357&state=*
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 4f71e962279a..6b45e63fae4b 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h @@ -306,6 +306,7 @@ struct ath9k_htc_tx { DECLARE_BITMAP(tx_slot, MAX_TX_BUF_NUM); struct timer_list cleanup_timer; spinlock_t tx_lock; + bool initialized; }; struct ath9k_htc_tx_ctl { diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 0d4595ee51ba..a5240a7f8c00 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c @@ -813,6 +813,9 @@ int ath9k_tx_init(struct ath9k_htc_priv *priv) skb_queue_head_init(&priv->tx.data_vi_queue); skb_queue_head_init(&priv->tx.data_vo_queue); skb_queue_head_init(&priv->tx.tx_failed); + /* Allow ath9k_wmi_event_tasklet(WMI_TXSTATUS_EVENTID) to operate. */ + smp_wmb(); + priv->tx.initialized = true; return 0; } diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c index fe29ad4b9023..7e17d86bf5d3 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.c +++ b/drivers/net/wireless/ath/ath9k/wmi.c @@ -169,6 +169,9 @@ void ath9k_wmi_event_tasklet(struct tasklet_struct *t) &wmi->drv_priv->fatal_work); break; case WMI_TXSTATUS_EVENTID: + /* Check if ath9k_tx_init() completed. */ + if (!data_race(priv->tx.initialized)) + break; spin_lock_bh(&priv->tx.tx_lock); if (priv->tx.flags & ATH9K_HTC_OP_TX_DRAIN) { spin_unlock_bh(&priv->tx.tx_lock);