Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions src/audio/drc/drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,20 @@ static int drc_setup(struct processing_module *mod, uint16_t channels, uint32_t
return drc_set_pre_delay_time(&cd->state, cd->config->params.pre_delay_time, rate);
}

static int drc_validator(struct comp_dev *dev, void *new_data, uint32_t new_data_size)
{
struct sof_drc_config *config = new_data;

if (new_data_size != sizeof(struct sof_drc_config) ||
new_data_size != config->size) {
comp_err(dev, "invalid configuration blob, size %u, expected %zu",
new_data_size, sizeof(struct sof_drc_config));
return -EINVAL;
}

return 0;
}
Comment on lines +142 to +154

/*
* End of DRC setup code. Next the standard component methods.
*/
Expand Down Expand Up @@ -168,6 +182,11 @@ __cold static int drc_init(struct processing_module *mod)
goto cd_fail;
}

/* Reject malformed blobs at IPC time so a bad run-time update cannot
* replace the working configuration.
*/
comp_data_blob_set_validator(cd->model_handler, drc_validator);

drc_reset_state(mod, &cd->state);

/* Initialize DRC to enabled. If defined by topology, a control may set
Expand Down Expand Up @@ -353,10 +372,8 @@ static int drc_prepare(struct processing_module *mod,
/* Initialize DRC */
comp_info(dev, "source_format=%d", cd->source_format);
cd->config = comp_get_data_blob(cd->model_handler, &data_size, NULL);
/* the blob is dereferenced as a struct sof_drc_config below and in
* drc_setup(), so require it to be at least that large
*/
if (cd->config && data_size >= sizeof(struct sof_drc_config)) {

if (cd->config) {
Comment on lines 374 to +376
ret = drc_setup(mod, channels, rate);
if (ret < 0) {
comp_err(dev, "error: drc_setup failed.");
Expand Down
Loading