FAILED: Patch "ASoC: SOF: ipc4-topology: Correct the allocation size for bytes controls" failed to apply to 6.12-stable tree
Subsystems (4)
Sasha Levin
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From a653820700b81c9e6f05ac23b7969ecec1a18e85 Mon Sep 17 00:00:00 2001
From: Peter Ujfalusi <[email protected]>
Date: Wed, 17 Dec 2025 16:39:39 +0200
Subject: [PATCH] ASoC: SOF: ipc4-topology: Correct the allocation size for
bytes controls
The size of the data behind of scontrol->ipc_control_data for bytes controls is:
[1] sizeof(struct sof_ipc4_control_data) + // kernel only struct
[2] sizeof(struct sof_abi_hdr)) + payload
The max_size specifies the size of [2] and it is coming from topology.
Change the function to take this into account and allocate adequate amount of memory behind scontrol->ipc_control_data.
With the change we will allocate [1] amount more memory to be able to hold the full size of data.
--- sound/soc/sof/ipc4-topology.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-)
sound/soc/sof/ipc4-topology.c +27 -8
@@ -2855,22 +2855,41 @@ static int sof_ipc4_control_load_bytes(struct snd_sof_dev *sdev, struct snd_sof_struct sof_ipc4_msg *msg;int ret; -if (scontrol->max_size < (sizeof (*control_data) +sizeof (struct sof_abi_hdr ))) { -dev_err (sdev->dev,"insufficient size for a bytes control %s: %zu.\n" , +/* +* The max_size is coming from topology and indicates the maximum size +* of sof_abi_hdr plus the payload, which excludes the local only +* 'struct sof_ipc4_control_data' +*/ +if (scontrol->max_size <sizeof (struct sof_abi_hdr )) { +dev_err (sdev->dev, +"insufficient maximum size for a bytes control %s: %zu.\n" , scontrol->name, scontrol->max_size);return -EINVAL ; } -if (scontrol->priv_size > scontrol->max_size -sizeof (*control_data)) { -dev_err (sdev->dev,"scontrol %s bytes data size %zu exceeds max %zu.\n" , - scontrol->name, scontrol->priv_size, - scontrol->max_size -sizeof (*control_data)); +if (scontrol->priv_size > scontrol->max_size) { +dev_err (sdev->dev, +"bytes control %s initial data size %zu exceeds max %zu.\n" , + scontrol->name, scontrol->priv_size, scontrol->max_size); +return -EINVAL ; + } + +if (scontrol->priv_size <sizeof (struct sof_abi_hdr )) { +dev_err (sdev->dev, +"bytes control %s initial data size %zu is insufficient.\n" , + scontrol->name, scontrol->priv_size);return -EINVAL ; } - scontrol->size =sizeof (struct sof_ipc4_control_data ) + scontrol->priv_size; +/* +* The used size behind the cdata pointer, which can be smaller than +* the maximum size +*/ + scontrol->size =sizeof (*control_data) + scontrol->priv_size; - scontrol->ipc_control_data =kzalloc (scontrol->max_size,GFP_KERNEL ); +/* Allocate the cdata: local struct size + maximum payload size */ + scontrol->ipc_control_data =kzalloc (sizeof (*control_data) + scontrol->max_size, +GFP_KERNEL );if (!scontrol->ipc_control_data)return -ENOMEM ;
Signature · 1 line
2.51.0