From eb712a40db3dae1be73acda772b2e62dd73a92a1 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Tue, 25 Oct 2022 15:19:22 +0200 Subject: [PATCH] volume: don't modify read-only mailbox data Fix a case of dropping the `const` modifier and overwriting read-only data in the mailbox in volume_set_config(). Signed-off-by: Guennadi Liakhovetski --- .../module_adapter/module/volume/volume.c | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/audio/module_adapter/module/volume/volume.c b/src/audio/module_adapter/module/volume/volume.c index 45c637998..657fbba11 100644 --- a/src/audio/module_adapter/module/volume/volume.c +++ b/src/audio/module_adapter/module/volume/volume.c @@ -919,7 +919,7 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id, struct vol_data *cd = module_get_private_data(mod); struct module_data *md = &mod->priv; struct comp_dev *dev = mod->dev; - struct ipc4_peak_volume_config *cdata; + struct ipc4_peak_volume_config cdata; int i, ret; comp_dbg(dev, "volume_set_config()"); @@ -936,19 +936,19 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id, md->state < MODULE_INITIALIZED) return 0; - cdata = (struct ipc4_peak_volume_config *)ASSUME_ALIGNED(fragment, 8); - cdata->target_volume = convert_volume_ipc4_to_ipc3(dev, cdata->target_volume); + cdata = *(const struct ipc4_peak_volume_config *)fragment; + cdata.target_volume = convert_volume_ipc4_to_ipc3(dev, cdata.target_volume); - init_ramp(cd, cdata->curve_duration, cdata->target_volume); + init_ramp(cd, cdata.curve_duration, cdata.target_volume); cd->ramp_finished = true; switch (config_id) { case IPC4_VOLUME: - if (cdata->channel_id == IPC4_ALL_CHANNELS_MASK) { + if (cdata.channel_id == IPC4_ALL_CHANNELS_MASK) { for (i = 0; i < mod->priv.cfg.base_cfg.audio_fmt.channels_count; i++) { - set_volume_ipc4(cd, i, cdata->target_volume, - cdata->curve_type, - cdata->curve_duration); + set_volume_ipc4(cd, i, cdata.target_volume, + cdata.curve_type, + cdata.curve_duration); cd->volume[i] = cd->vol_min; volume_set_chan(mod, i, cd->tvolume[i], true); @@ -956,14 +956,14 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id, cd->ramp_finished = false; } } else { - set_volume_ipc4(cd, cdata->channel_id, cdata->target_volume, - cdata->curve_type, - cdata->curve_duration); + set_volume_ipc4(cd, cdata.channel_id, cdata.target_volume, + cdata.curve_type, + cdata.curve_duration); - cd->volume[cdata->channel_id] = cd->vol_min; - volume_set_chan(mod, cdata->channel_id, cd->tvolume[cdata->channel_id], + cd->volume[cdata.channel_id] = cd->vol_min; + volume_set_chan(mod, cdata.channel_id, cd->tvolume[cdata.channel_id], true); - if (cd->volume[cdata->channel_id] != cd->tvolume[cdata->channel_id]) + if (cd->volume[cdata.channel_id] != cd->tvolume[cdata.channel_id]) cd->ramp_finished = false; }