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

Commit 7e797494 authored by Satyajit Desai's avatar Satyajit Desai
Browse files

coresight-tmc: Re-use ETR buffer across use cases



We can run into use after free scenario for the buffer memory
if enable and read operations happen simultaneously. Add mutex
protection in order to prevent such a scenario.

Change-Id: I3106564a46a9cffc0db8808ba03f78d76c925eca
Signed-off-by: default avatarSatyajit Desai <sadesai@codeaurora.org>
parent 707a2ed2
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -940,11 +940,12 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
{
	unsigned long flags;
	void *vaddr = NULL;

	/* config types are set a boot time and never change */
	if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
		return -EINVAL;

	mutex_lock(&drvdata->mem_lock);
	spin_lock_irqsave(&drvdata->spinlock, flags);

	/* RE-enable the TMC if need be */
@@ -957,12 +958,16 @@ int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
		 */
		tmc_etr_enable_hw(drvdata);
	} else {
		tmc_etr_free_mem(drvdata);
		vaddr = drvdata->vaddr;
		drvdata->buf = NULL;
	}

	drvdata->reading = false;
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	if (vaddr)
		tmc_etr_free_mem(drvdata);

	mutex_unlock(&drvdata->mem_lock);
	return 0;
}