diff options
Diffstat (limited to '0001-iwlwifi-pcie-fix-memory-leaks-in-iwl_pcie_ctxt_info_.patch')
-rw-r--r-- | 0001-iwlwifi-pcie-fix-memory-leaks-in-iwl_pcie_ctxt_info_.patch | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/0001-iwlwifi-pcie-fix-memory-leaks-in-iwl_pcie_ctxt_info_.patch b/0001-iwlwifi-pcie-fix-memory-leaks-in-iwl_pcie_ctxt_info_.patch new file mode 100644 index 000000000..a72e920bd --- /dev/null +++ b/0001-iwlwifi-pcie-fix-memory-leaks-in-iwl_pcie_ctxt_info_.patch @@ -0,0 +1,99 @@ +From 0f4f199443faca715523b0659aa536251d8b978f Mon Sep 17 00:00:00 2001 +From: Navid Emamdoost <navid.emamdoost@gmail.com> +Date: Fri, 27 Sep 2019 15:56:04 -0500 +Subject: [PATCH] iwlwifi: pcie: fix memory leaks in + iwl_pcie_ctxt_info_gen3_init + +In iwl_pcie_ctxt_info_gen3_init there are cases that the allocated dma +memory is leaked in case of error. + +DMA memories prph_scratch, prph_info, and ctxt_info_gen3 are allocated +and initialized to be later assigned to trans_pcie. But in any error case +before such assignment the allocated memories should be released. + +First of such error cases happens when iwl_pcie_init_fw_sec fails. +Current implementation correctly releases prph_scratch. But in two +sunsequent error cases where dma_alloc_coherent may fail, such +releases are missing. + +This commit adds release for prph_scratch when allocation for +prph_info fails, and adds releases for prph_scratch and prph_info when +allocation for ctxt_info_gen3 fails. + +Fixes: 2ee824026288 ("iwlwifi: pcie: support context information for 22560 devices") +Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com> +Signed-off-by: Luca Coelho <luciano.coelho@intel.com> +--- + .../intel/iwlwifi/pcie/ctxt-info-gen3.c | 36 +++++++++++++------ + 1 file changed, 25 insertions(+), 11 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +index 75fa8a6aafee..74980382e64c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +@@ -107,13 +107,9 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, + + /* allocate ucode sections in dram and set addresses */ + ret = iwl_pcie_init_fw_sec(trans, fw, &prph_scratch->dram); +- if (ret) { +- dma_free_coherent(trans->dev, +- sizeof(*prph_scratch), +- prph_scratch, +- trans_pcie->prph_scratch_dma_addr); +- return ret; +- } ++ if (ret) ++ goto err_free_prph_scratch; ++ + + /* Allocate prph information + * currently we don't assign to the prph info anything, but it would get +@@ -121,16 +117,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, + prph_info = dma_alloc_coherent(trans->dev, sizeof(*prph_info), + &trans_pcie->prph_info_dma_addr, + GFP_KERNEL); +- if (!prph_info) +- return -ENOMEM; ++ if (!prph_info) { ++ ret = -ENOMEM; ++ goto err_free_prph_scratch; ++ } + + /* Allocate context info */ + ctxt_info_gen3 = dma_alloc_coherent(trans->dev, + sizeof(*ctxt_info_gen3), + &trans_pcie->ctxt_info_dma_addr, + GFP_KERNEL); +- if (!ctxt_info_gen3) +- return -ENOMEM; ++ if (!ctxt_info_gen3) { ++ ret = -ENOMEM; ++ goto err_free_prph_info; ++ } + + ctxt_info_gen3->prph_info_base_addr = + cpu_to_le64(trans_pcie->prph_info_dma_addr); +@@ -186,6 +186,20 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, + iwl_set_bit(trans, CSR_GP_CNTRL, CSR_AUTO_FUNC_INIT); + + return 0; ++ ++err_free_prph_info: ++ dma_free_coherent(trans->dev, ++ sizeof(*prph_info), ++ prph_info, ++ trans_pcie->prph_info_dma_addr); ++ ++err_free_prph_scratch: ++ dma_free_coherent(trans->dev, ++ sizeof(*prph_scratch), ++ prph_scratch, ++ trans_pcie->prph_scratch_dma_addr); ++ return ret; ++ + } + + void iwl_pcie_ctxt_info_gen3_free(struct iwl_trans *trans) +-- +2.23.0 + |