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

Commit b0d918e4 authored by Raghavendra Rao Ananta's avatar Raghavendra Rao Ananta
Browse files

soc: qcom: pil: Avoid usage of variable length array



The function, pil_load_segs(), declares a bitmap (err_map)
as a Variable Length Array (VLA). VLAs are considered unfit
when it comes to security, performance, code quality, and so
on. Hence, allocate the memory dynamically for the same bitmap.

Change-Id: I4d226eb6ab9c27910db41bf87d881a30f32a6c74
Signed-off-by: default avatarRaghavendra Rao Ananta <rananta@codeaurora.org>
parent 4719c01d
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -916,17 +916,25 @@ static void pil_load_seg_work_fn(struct work_struct *work)

static int pil_load_segs(struct pil_desc *desc)
{
	int ret = 0;
	int seg_id = 0;
	struct pil_priv *priv = desc->priv;
	struct pil_seg_data *pil_seg_data;
	struct pil_seg *seg;
	DECLARE_BITMAP(err_map, priv->num_segs);
	unsigned long *err_map;

	pil_seg_data = kcalloc(priv->num_segs, sizeof(*pil_seg_data),
	err_map = kcalloc(BITS_TO_LONGS(priv->num_segs), sizeof(unsigned long),
				GFP_KERNEL);
	if (!pil_seg_data)
	if (!err_map)
		return -ENOMEM;

	pil_seg_data = kcalloc(priv->num_segs, sizeof(*pil_seg_data),
				GFP_KERNEL);
	if (!pil_seg_data) {
		ret = -ENOMEM;
		goto out;
	}

	/* Initialize and spawn a thread for each segment */
	list_for_each_entry(seg, &desc->priv->segs, list) {
		pil_seg_data[seg_id].seg_id = seg_id;
@@ -964,9 +972,11 @@ static int pil_load_segs(struct pil_desc *desc)

	/* Each segment can fail due to different reason. Send a generic err */
	if (!bitmap_empty(err_map, priv->num_segs))
		return -EFAULT;
		ret = -EFAULT;

	return 0;
out:
	kfree(err_map);
	return ret;
}

/**