diff mbox series

mt76: fix potential NULL pointer dereference in mt76_stop_tx_queues

Message ID 98cf4a8f8a7f7840803b91b7c9078d8b61febee9.1542384797.git.lorenzo.bianconi@redhat.com
State Awaiting Upstream, archived
Delegated to: David Miller
Headers show
Series mt76: fix potential NULL pointer dereference in mt76_stop_tx_queues | expand

Commit Message

Lorenzo Bianconi Nov. 16, 2018, 4:19 p.m. UTC
Starting from mac80211 commit adf8ed01e4fd ("mac80211: add an optional
TXQ for other PS-buffered frames") and commit 0eeb2b674f05 ("mac80211:
add an option for station management TXQ") a new per-sta queue has been
introduced for bufferable management frames.
sta->txq[IEEE80211_NUM_TIDS] is initialized just if the driver reports
the following hw flags:
- IEEE80211_HW_STA_MMPDU_TXQ
- IEEE80211_HW_BUFF_MMPDU_TXQ
This can produce a NULL pointer dereference in mt76_stop_tx_queues
since mt76 iterates on all available sta tx queues assuming they are
initialized by mac80211. This issue has been spotted analyzing the code
(it has not triggered any crash yet)

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
This patch is for 4.20
---
 drivers/net/wireless/mediatek/mt76/tx.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Kalle Valo Nov. 17, 2018, 11:13 a.m. UTC | #1
Lorenzo Bianconi <lorenzo.bianconi@redhat.com> writes:

> Starting from mac80211 commit adf8ed01e4fd ("mac80211: add an optional
> TXQ for other PS-buffered frames") and commit 0eeb2b674f05 ("mac80211:
> add an option for station management TXQ") a new per-sta queue has been
> introduced for bufferable management frames.
> sta->txq[IEEE80211_NUM_TIDS] is initialized just if the driver reports
> the following hw flags:
> - IEEE80211_HW_STA_MMPDU_TXQ
> - IEEE80211_HW_BUFF_MMPDU_TXQ
> This can produce a NULL pointer dereference in mt76_stop_tx_queues
> since mt76 iterates on all available sta tx queues assuming they are
> initialized by mac80211. This issue has been spotted analyzing the code
> (it has not triggered any crash yet)
>
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>

A very good commit log, thanks for that!

> This patch is for 4.20

Ok, I'll wait for review comments and then queue this for 4.20.

BTW, it would make my patch sorting easier if you could add a release
label in the subject:

[PATCH 4.20] mt76: fix potential NULL pointer dereference in mt76_stop_tx_queues

More info:

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches#tree_labels
Lorenzo Bianconi Nov. 17, 2018, 5:46 p.m. UTC | #2
> A very good commit log, thanks for that!
>
> > This patch is for 4.20
>
> Ok, I'll wait for review comments and then queue this for 4.20.
>
> BTW, it would make my patch sorting easier if you could add a release
> label in the subject:
>
> [PATCH 4.20] mt76: fix potential NULL pointer dereference in mt76_stop_tx_queues
>
> More info:
>
> https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches#tree_labels

Ack, will do next time :)

Regards,
Lorenzo

>
> --
> Kalle Valo
Kalle Valo Dec. 13, 2018, 2:20 p.m. UTC | #3
Lorenzo Bianconi <lorenzo.bianconi@redhat.com> wrote:

> Starting from mac80211 commit adf8ed01e4fd ("mac80211: add an optional
> TXQ for other PS-buffered frames") and commit 0eeb2b674f05 ("mac80211:
> add an option for station management TXQ") a new per-sta queue has been
> introduced for bufferable management frames.
> sta->txq[IEEE80211_NUM_TIDS] is initialized just if the driver reports
> the following hw flags:
> - IEEE80211_HW_STA_MMPDU_TXQ
> - IEEE80211_HW_BUFF_MMPDU_TXQ
> This can produce a NULL pointer dereference in mt76_stop_tx_queues
> since mt76 iterates on all available sta tx queues assuming they are
> initialized by mac80211. This issue has been spotted analyzing the code
> (it has not triggered any crash yet)
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>

Patch applied to wireless-drivers.git, thanks.

7c250f4612ae mt76: fix potential NULL pointer dereference in mt76_stop_tx_queues
diff mbox series

Patch

diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c
index 7cbce03aa65b..aa426b838ffa 100644
--- a/drivers/net/wireless/mediatek/mt76/tx.c
+++ b/drivers/net/wireless/mediatek/mt76/tx.c
@@ -400,7 +400,12 @@  void mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta,
 
 	for (i = 0; i < ARRAY_SIZE(sta->txq); i++) {
 		struct ieee80211_txq *txq = sta->txq[i];
-		struct mt76_txq *mtxq = (struct mt76_txq *) txq->drv_priv;
+		struct mt76_txq *mtxq;
+
+		if (!txq)
+			continue;
+
+		mtxq = (struct mt76_txq *)txq->drv_priv;
 
 		spin_lock_bh(&mtxq->hwq->lock);
 		mtxq->send_bar = mtxq->aggr && send_bar;