iwlwifi: pcie: NULLify pointers after free
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 10 Feb 2021 11:56:35 +0000 (13:56 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 10 Feb 2021 12:37:30 +0000 (14:37 +0200)
Remember that those pointers have been freed by setting them
to NULL. Otherwise, we'd keep rxq pointing to random memory
which would prevent us from trying to re-allocate the Rx
resources if we call rx_alloc again.

Also, propagate the allocation failure to the caller of
iwl_pcie_nic_init so that we won't go further in the
start flow.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210210135352.996b400d2f1c.I630379c504644700322f57b259383ae0af8d1975@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/rx.c
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index 407809c..664481c 100644 (file)
@@ -834,8 +834,11 @@ err:
                trans_pcie->base_rb_stts_dma = 0;
        }
        kfree(trans_pcie->rx_pool);
+       trans_pcie->rx_pool = NULL;
        kfree(trans_pcie->global_table);
+       trans_pcie->global_table = NULL;
        kfree(trans_pcie->rxq);
+       trans_pcie->rxq = NULL;
 
        return ret;
 }
index a73f2c5..c0d2221 100644 (file)
@@ -523,11 +523,15 @@ static int iwl_pcie_nic_init(struct iwl_trans *trans)
        iwl_op_mode_nic_config(trans->op_mode);
 
        /* Allocate the RX queue, or reset if it is already allocated */
-       iwl_pcie_rx_init(trans);
+       ret = iwl_pcie_rx_init(trans);
+       if (ret)
+               return ret;
 
        /* Allocate or reset and init all Tx and Command queues */
-       if (iwl_pcie_tx_init(trans))
+       if (iwl_pcie_tx_init(trans)) {
+               iwl_pcie_rx_free(trans);
                return -ENOMEM;
+       }
 
        if (trans->trans_cfg->base_params->shadow_reg_enable) {
                /* enable shadow regs in HW */