Skip to content

Commit a8c1a5e

Browse files
committed
audio: data_blob: fix memcpy_s bounds in ipc4_comp_data_blob_set
Pass the real destination capacity instead of the copy count so the size check is effective, preventing a host-controlled heap overflow of data_new. Signed-off-by: Adrian Bonislawski <adrian.bonislawski@intel.com>
1 parent 3f7738d commit a8c1a5e

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

src/audio/data_blob.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,11 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
365365
valid_data_size = last_block ? data_offset : MAILBOX_DSPBOX_SIZE;
366366

367367
ret = memcpy_s((char *)blob_handler->data_new,
368-
valid_data_size, data, valid_data_size);
369-
assert(!ret);
368+
blob_handler->new_data_size, data, valid_data_size);
369+
if (ret) {
370+
comp_err(blob_handler->dev, "failed to copy fragment");
371+
return ret;
372+
}
370373

371374
blob_handler->data_pos += valid_data_size;
372375
} else {
@@ -391,8 +394,12 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
391394
valid_data_size = blob_handler->new_data_size - data_offset;
392395

393396
ret = memcpy_s((char *)blob_handler->data_new + data_offset,
394-
valid_data_size, data, valid_data_size);
395-
assert(!ret);
397+
blob_handler->new_data_size - data_offset,
398+
data, valid_data_size);
399+
if (ret) {
400+
comp_err(blob_handler->dev, "failed to copy fragment");
401+
return ret;
402+
}
396403

397404
blob_handler->data_pos += valid_data_size;
398405
}

0 commit comments

Comments
 (0)