wifi: iwlwifi: add a validity check of queue_id in iwl_txq_reclaim
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 13 Apr 2023 07:44:03 +0000 (10:44 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 13 Apr 2023 14:29:59 +0000 (16:29 +0200)
This function receives the queue id to reclaim packets from. Currently
we're passing to it the queue id we received from the FW in the flush
response. We don't do any check of this value and it might be invalid.
In such case we will refer to a pointer to a queue which might be NULL.
Fix this by adding a validity check of the queue id before using it.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230413102635.a9c3fd32bce7.I5fbdcf3b1b80eb96a907116c166f19dc0aae7cb8@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/queue/tx.c

index 726185d..d1c39c2 100644 (file)
@@ -1554,14 +1554,18 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
                     struct sk_buff_head *skbs)
 {
        struct iwl_txq *txq = trans->txqs.txq[txq_id];
-       int tfd_num = iwl_txq_get_cmd_index(txq, ssn);
-       int read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
-       int last_to_free;
+       int tfd_num, read_ptr, last_to_free;
 
        /* This function is not meant to release cmd queue*/
        if (WARN_ON(txq_id == trans->txqs.cmd.q_id))
                return;
 
+       if (WARN_ON(!txq))
+               return;
+
+       tfd_num = iwl_txq_get_cmd_index(txq, ssn);
+       read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
+
        spin_lock_bh(&txq->lock);
 
        if (!test_bit(txq_id, trans->txqs.queue_used)) {