diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index 109bc2a4a6b2..663856d7e033 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -77,7 +77,8 @@ static int copier_alh_assign_dai_index(struct comp_dev *dev, struct copier_data *cd = module_get_private_data(mod); const struct sof_alh_configuration_blob *alh_blob = gtw_cfg_data; uint8_t *dma_config; - size_t alh_cfg_size, dma_config_length; + size_t alh_cfg_size, dma_config_length, blob_size; + uint32_t alh_count; int i, dai_num, ret; if (!cd->config.gtw_cfg.config_length) { @@ -85,6 +86,21 @@ static int copier_alh_assign_dai_index(struct comp_dev *dev, return -EINVAL; } + blob_size = (size_t)cd->config.gtw_cfg.config_length << 2; + if (blob_size < sizeof(alh_blob->gtw_attributes) + sizeof(alh_blob->alh_cfg.count)) { + comp_err(mod->dev, "Invalid ALH gateway config: blob=%u bytes", + (uint32_t)blob_size); + return -EINVAL; + } + + alh_count = alh_blob->alh_cfg.count; + if (alh_count > IPC4_ALH_MAX_NUMBER_OF_GTW || + get_alh_config_size(alh_blob) > blob_size) { + comp_err(mod->dev, "Invalid ALH gateway config: count=%u, blob=%u bytes", + alh_count, (uint32_t)blob_size); + return -EINVAL; + } + switch (dai->type) { case SOF_DAI_INTEL_HDA: /* We use DAI_INTEL_HDA for ACE 2.0 platforms */