Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -657,7 +657,7 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
	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,
			   enum iwl_ucode_type type)
{
@@ -667,7 +667,7 @@ static int alloc_pci_desc(struct iwl_drv *drv,
	     i++)
		if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]),
				      get_sec(pieces, type, i)))
			return -1;
			return -ENOMEM;
	return 0;
}

@@ -825,8 +825,8 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
	 * 1) unmodified from disk
	 * 2) backup cache for save/restore during power-downs */
	for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)
		if (alloc_pci_desc(drv, &pieces, i))
			goto err_pci_alloc;
		if (iwl_alloc_ucode(drv, &pieces, i))
			goto out_free_fw;

	/* 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)
	drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw);

	if (!drv->op_mode)
		goto out_unbind;
		goto out_free_fw;

	return;

@@ -877,7 +877,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
		goto out_unbind;
	return;

 err_pci_alloc:
 out_free_fw:
	IWL_ERR(drv, "failed to allocate pci memory\n");
	iwl_dealloc_ucode(drv);
	release_firmware(ucode_raw);