Skip to content

Commit 0b214bb

Browse files
committed
module_adapter: ipc4: validate pin counts against IPC4 maximum
Reject IPC4 module init payloads where nb_input_pins or nb_output_pins exceed the protocol maximum (IPC4_MAX_SRC_QUEUE / IPC4_MAX_DST_QUEUE = 8). The existing cfgsz equality check ensures the immediate pointer arithmetic is in-bounds, but it does not prevent unsupported pin counts from being stored in dst->nb_input_pins / dst->nb_output_pins and used by downstream module code. Add explicit upper-bound validation before computing pinsz, matching the IPC4 ABI contract advertised via IPC4_MAX_MODULE_PIN_COUNT_FW_CFG. Signed-off-by: Adrian Bonislawski <adrian.bonislawski@intel.com>
1 parent cb7a692 commit 0b214bb

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

src/audio/module_adapter/module_adapter_ipc4.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <sof/ut.h>
2121
#include <rtos/interrupt.h>
2222
#include <rtos/symbol.h>
23+
#include <ipc4/base_fw.h>
2324
#include <limits.h>
2425
#include <stdint.h>
2526

@@ -141,8 +142,13 @@ int module_adapter_init_data(struct comp_dev *dev,
141142
if (cfgsz >= sizeof(*cfg)) {
142143
int n_in = cfg->base_cfg_ext.nb_input_pins;
143144
int n_out = cfg->base_cfg_ext.nb_output_pins;
144-
size_t pinsz = (n_in * sizeof(*dst->input_pins))
145-
+ (n_out * sizeof(*dst->output_pins));
145+
size_t pinsz;
146+
147+
if (n_in > IPC4_MAX_SRC_QUEUE || n_out > IPC4_MAX_DST_QUEUE)
148+
return -EINVAL;
149+
150+
pinsz = (n_in * sizeof(*dst->input_pins))
151+
+ (n_out * sizeof(*dst->output_pins));
146152

147153
if (cfgsz == (sizeof(*cfg) + pinsz)) {
148154
dst->nb_input_pins = n_in;

0 commit comments

Comments
 (0)