[PATCH] coresight: platform: defer connection counter increment until alloc succeeds
James Clark
james.clark at linaro.org
Tue May 19 05:46:16 PDT 2026
On 11/05/2026 5:19 am, Jie Gan wrote:
> coresight_add_out_conn() increments nr_outconns before calling
> devm_krealloc_array() and again before devm_kmalloc(). If either
> allocation fails, the counter is already bumped while the corresponding
> array entry is NULL or uninitialized garbage.
>
> coresight_add_in_conn() has the same problem with nr_inconns and
> devm_krealloc_array().
>
> In both cases the probe returns -ENOMEM, which causes
> coresight_get_platform_data() to call coresight_release_platform_data()
> for cleanup. That function iterates up to nr_outconns (or nr_inconns)
> entries and dereferences each pointer unconditionally, hitting the NULL
> or garbage entry and panicking instead of failing gracefully.
>
> Fix by moving the counter increments to after all allocations succeed,
> so the struct is always consistent on any error path.
>
> Fixes: 3d4ff657e454 ("coresight: Dynamically add connections")
> Fixes: e3f4e68797a9 ("coresight: Store in-connections as well as out-connections")
> Signed-off-by: Jie Gan <jie.gan at oss.qualcomm.com>
Reviewed-by: James Clark <james.clark at linaro.org>
> ---
> drivers/hwtracing/coresight/coresight-platform.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
> index e337b6e2bf32..93c2d075cad6 100644
> --- a/drivers/hwtracing/coresight/coresight-platform.c
> +++ b/drivers/hwtracing/coresight/coresight-platform.c
> @@ -45,9 +45,8 @@ coresight_add_out_conn(struct device *dev,
> }
> }
>
> - pdata->nr_outconns++;
> pdata->out_conns =
> - devm_krealloc_array(dev, pdata->out_conns, pdata->nr_outconns,
> + devm_krealloc_array(dev, pdata->out_conns, pdata->nr_outconns + 1,
> sizeof(*pdata->out_conns), GFP_KERNEL);
> if (!pdata->out_conns)
> return ERR_PTR(-ENOMEM);
> @@ -63,7 +62,8 @@ coresight_add_out_conn(struct device *dev,
> * used right away.
> */
> *conn = *new_conn;
> - pdata->out_conns[pdata->nr_outconns - 1] = conn;
> + pdata->out_conns[pdata->nr_outconns] = conn;
> + pdata->nr_outconns++;
> return conn;
> }
> EXPORT_SYMBOL_GPL(coresight_add_out_conn);
> @@ -86,13 +86,13 @@ int coresight_add_in_conn(struct coresight_connection *out_conn)
> return 0;
> }
>
> - pdata->nr_inconns++;
> pdata->in_conns =
> - devm_krealloc_array(dev, pdata->in_conns, pdata->nr_inconns,
> + devm_krealloc_array(dev, pdata->in_conns, pdata->nr_inconns + 1,
> sizeof(*pdata->in_conns), GFP_KERNEL);
> if (!pdata->in_conns)
> return -ENOMEM;
> - pdata->in_conns[pdata->nr_inconns - 1] = out_conn;
> + pdata->in_conns[pdata->nr_inconns] = out_conn;
> + pdata->nr_inconns++;
> return 0;
> }
> EXPORT_SYMBOL_GPL(coresight_add_in_conn);
>
> ---
> base-commit: e98d21c170b01ddef366f023bbfcf6b31509fa83
> change-id: 20260511-fix-ref-count-issue-7c44ce39700f
>
> Best regards,
More information about the linux-arm-kernel
mailing list