From 3f08b13fc03d2ba19c24155e5af0b3dc818945b4 Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Thu, 18 Jun 2026 17:05:11 +0300 Subject: [PATCH] audio: drc: add IPC-time blob validator Hook a drc blob validator into the model handler so a corrupted run-time configuration update is rejected before it can replace the working blob. Playback or capture then continues with the previously set parameters instead of being interrupted by a bad IPC. The DRC configuration is a fixed-size struct sof_drc_config, so the validator requires the IPC payload size to match exactly and the self-declared config->size to agree with it. It is installed in drc_init() when the model handler is created, so every blob swap is covered - including any received while the component is in READY - and the redundant size check that drc_prepare() used to run on the initial blob is dropped. Signed-off-by: Seppo Ingalsuo --- src/audio/drc/drc.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/audio/drc/drc.c b/src/audio/drc/drc.c index 7fe86ce01c56..2c58b2e93a15 100644 --- a/src/audio/drc/drc.c +++ b/src/audio/drc/drc.c @@ -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; +} + /* * End of DRC setup code. Next the standard component methods. */ @@ -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 @@ -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) { ret = drc_setup(mod, channels, rate); if (ret < 0) { comp_err(dev, "error: drc_setup failed.");