ASoC: SOF: ipc3-topology: Move and correct size checks in sof_ipc3_control_load_bytes()
Move the size checks prior to allocating memory as these checks do not need the data to be allocated and in case of an error we would not need to free the allocation. The max size must not be less than the size of struct sof_ipc_ctrl_data + struct sof_abi_hdr as the ABI header needs to be present under all circumstances. The check was incorrectly used or between the two size checks. Fixes: b5cee8feb1d4 ("ASoC: SOF: topology: Make control parsing IPC agnostic") Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Link: https://lore.kernel.org/r/20220610084735.19397-1-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
4643e10a17
commit
5702b838dd
@ -1577,24 +1577,23 @@ static int sof_ipc3_control_load_bytes(struct snd_sof_dev *sdev, struct snd_sof_
|
||||
struct sof_ipc_ctrl_data *cdata;
|
||||
int ret;
|
||||
|
||||
if (scontrol->max_size < (sizeof(*cdata) + sizeof(struct sof_abi_hdr))) {
|
||||
dev_err(sdev->dev, "%s: insufficient size for a bytes control: %zu.\n",
|
||||
__func__, scontrol->max_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (scontrol->priv_size > scontrol->max_size - sizeof(*cdata)) {
|
||||
dev_err(sdev->dev,
|
||||
"%s: bytes data size %zu exceeds max %zu.\n", __func__,
|
||||
scontrol->priv_size, scontrol->max_size - sizeof(*cdata));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
scontrol->ipc_control_data = kzalloc(scontrol->max_size, GFP_KERNEL);
|
||||
if (!scontrol->ipc_control_data)
|
||||
return -ENOMEM;
|
||||
|
||||
if (scontrol->max_size < sizeof(*cdata) ||
|
||||
scontrol->max_size < sizeof(struct sof_abi_hdr)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* init the get/put bytes data */
|
||||
if (scontrol->priv_size > scontrol->max_size - sizeof(*cdata)) {
|
||||
dev_err(sdev->dev, "err: bytes data size %zu exceeds max %zu.\n",
|
||||
scontrol->priv_size, scontrol->max_size - sizeof(*cdata));
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
scontrol->size = sizeof(struct sof_ipc_ctrl_data) + scontrol->priv_size;
|
||||
|
||||
cdata = scontrol->ipc_control_data;
|
||||
|
Loading…
x
Reference in New Issue
Block a user