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

Commit be76fc66 authored by Rajkumar Raghupathy's avatar Rajkumar Raghupathy Committed by Matt Wagantall
Browse files

soc: qcom: pil-msa: Free mba region if metadata authentication fails



There is a memory leak in the error path when modem metadata
authentication fails. Free the MBA region to fix this.

Change-Id: I3b33af58bba6532c7714070a62dce1dd99c63601
Signed-off-by: default avatarRajkumar Raghupathy <raghup@codeaurora.org>
parent f960442f
Loading
Loading
Loading
Loading
+14 −5
Original line number Original line Diff line number Diff line
@@ -482,6 +482,7 @@ int pil_mss_reset_load_mba(struct pil_desc *pil)
err_mss_reset:
err_mss_reset:
	dma_free_attrs(&md->mba_mem_dev, drv->mba_size, drv->mba_virt,
	dma_free_attrs(&md->mba_mem_dev, drv->mba_size, drv->mba_virt,
				drv->mba_phys, &md->attrs_dma);
				drv->mba_phys, &md->attrs_dma);
	drv->mba_virt = NULL;
err_dma_alloc:
err_dma_alloc:
	release_firmware(fw);
	release_firmware(fw);
	return ret;
	return ret;
@@ -505,7 +506,8 @@ static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata,
					GFP_KERNEL, &attrs);
					GFP_KERNEL, &attrs);
	if (!mdata_virt) {
	if (!mdata_virt) {
		dev_err(pil->dev, "MBA metadata buffer allocation failed\n");
		dev_err(pil->dev, "MBA metadata buffer allocation failed\n");
		return -ENOMEM;
		ret = -ENOMEM;
		goto fail;
	}
	}
	memcpy(mdata_virt, metadata, size);
	memcpy(mdata_virt, metadata, size);
	/* wmb() ensures copy completes prior to starting authentication. */
	/* wmb() ensures copy completes prior to starting authentication. */
@@ -530,10 +532,17 @@ static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata,


	dma_free_attrs(&drv->mba_mem_dev, size, mdata_virt, mdata_phys, &attrs);
	dma_free_attrs(&drv->mba_mem_dev, size, mdata_virt, mdata_phys, &attrs);


	if (ret) {
	if (!ret)
		return ret;

fail:
	modem_log_rmb_regs(drv->rmb_base);
	modem_log_rmb_regs(drv->rmb_base);
		if (drv->q6)
	if (drv->q6) {
		pil_mss_shutdown(pil);
		pil_mss_shutdown(pil);
		dma_free_attrs(&drv->mba_mem_dev, drv->q6->mba_size,
				drv->q6->mba_virt, drv->q6->mba_phys,
				&drv->attrs_dma);
		drv->q6->mba_virt = NULL;
	}
	}
	return ret;
	return ret;
}
}