Commit 75813bde authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

iwlwifi: fix memory leak if opmode fails to init

If drv->op_mode is NULL after trying to init the
opmode, we go to the wrong label. Fix this, and
clean up the code a bit.
Reviewed-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Reviewed-by: default avatarGuy Cohen <guy.cohen@intel.com>
Reviewed-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f4c37176
...@@ -657,17 +657,17 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -657,17 +657,17 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
return -EINVAL; return -EINVAL;
} }
static int alloc_pci_desc(struct iwl_drv *drv, static int iwl_alloc_ucode(struct iwl_drv *drv,
struct iwl_firmware_pieces *pieces, struct iwl_firmware_pieces *pieces,
enum iwl_ucode_type type) enum iwl_ucode_type type)
{ {
int i; int i;
for (i = 0; for (i = 0;
i < IWL_UCODE_SECTION_MAX && get_sec_size(pieces, type, i); i < IWL_UCODE_SECTION_MAX && get_sec_size(pieces, type, i);
i++) i++)
if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]), if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]),
get_sec(pieces, type, i))) get_sec(pieces, type, i)))
return -1; return -ENOMEM;
return 0; return 0;
} }
...@@ -825,8 +825,8 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -825,8 +825,8 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
* 1) unmodified from disk * 1) unmodified from disk
* 2) backup cache for save/restore during power-downs */ * 2) backup cache for save/restore during power-downs */
for (i = 0; i < IWL_UCODE_TYPE_MAX; i++) for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)
if (alloc_pci_desc(drv, &pieces, i)) if (iwl_alloc_ucode(drv, &pieces, i))
goto err_pci_alloc; goto out_free_fw;
/* Now that we can no longer fail, copy information */ /* Now that we can no longer fail, copy information */
...@@ -866,7 +866,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -866,7 +866,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw); drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw);
if (!drv->op_mode) if (!drv->op_mode)
goto out_unbind; goto out_free_fw;
return; return;
...@@ -877,7 +877,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -877,7 +877,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
goto out_unbind; goto out_unbind;
return; return;
err_pci_alloc: out_free_fw:
IWL_ERR(drv, "failed to allocate pci memory\n"); IWL_ERR(drv, "failed to allocate pci memory\n");
iwl_dealloc_ucode(drv); iwl_dealloc_ucode(drv);
release_firmware(ucode_raw); release_firmware(ucode_raw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment