Skip to content

Commit c282d3e

Browse files
committed
Merge: firmware: cs_dsp: Validate payload length before processing block
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4990 JIRA: https://issues.redhat.com/browse/RHEL-53640 CVE: CVE-2024-42237 Signed-off-by: David Arcari <darcari@redhat.com> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Lucas Zampieri <lzampier@redhat.com>
2 parents aee8a36 + a0cd49e commit c282d3e

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

drivers/firmware/cirrus/cs_dsp.c

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1534,6 +1534,12 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
15341534
}
15351535

15361536
region = (void *)&(firmware->data[pos]);
1537+
1538+
if (le32_to_cpu(region->len) > firmware->size - pos - sizeof(*region)) {
1539+
ret = -EOVERFLOW;
1540+
goto out_fw;
1541+
}
1542+
15371543
region_name = "Unknown";
15381544
reg = 0;
15391545
text = NULL;
@@ -1590,16 +1596,6 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
15901596
regions, le32_to_cpu(region->len), offset,
15911597
region_name);
15921598

1593-
if (le32_to_cpu(region->len) >
1594-
firmware->size - pos - sizeof(*region)) {
1595-
cs_dsp_err(dsp,
1596-
"%s.%d: %s region len %d bytes exceeds file length %zu\n",
1597-
file, regions, region_name,
1598-
le32_to_cpu(region->len), firmware->size);
1599-
ret = -EINVAL;
1600-
goto out_fw;
1601-
}
1602-
16031599
if (text) {
16041600
memcpy(text, region->data, le32_to_cpu(region->len));
16051601
cs_dsp_info(dsp, "%s: %s\n", file, text);
@@ -2229,6 +2225,11 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
22292225

22302226
blk = (void *)(&firmware->data[pos]);
22312227

2228+
if (le32_to_cpu(blk->len) > firmware->size - pos - sizeof(*blk)) {
2229+
ret = -EOVERFLOW;
2230+
goto out_fw;
2231+
}
2232+
22322233
type = le16_to_cpu(blk->type);
22332234
offset = le16_to_cpu(blk->offset);
22342235
version = le32_to_cpu(blk->ver) >> 8;
@@ -2325,17 +2326,6 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
23252326
}
23262327

23272328
if (reg) {
2328-
if (le32_to_cpu(blk->len) >
2329-
firmware->size - pos - sizeof(*blk)) {
2330-
cs_dsp_err(dsp,
2331-
"%s.%d: %s region len %d bytes exceeds file length %zu\n",
2332-
file, blocks, region_name,
2333-
le32_to_cpu(blk->len),
2334-
firmware->size);
2335-
ret = -EINVAL;
2336-
goto out_fw;
2337-
}
2338-
23392329
buf = cs_dsp_buf_alloc(blk->data,
23402330
le32_to_cpu(blk->len),
23412331
&buf_list);
@@ -2375,6 +2365,10 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
23752365
regmap_async_complete(regmap);
23762366
cs_dsp_buf_free(&buf_list);
23772367
kfree(text);
2368+
2369+
if (ret == -EOVERFLOW)
2370+
cs_dsp_err(dsp, "%s: file content overflows file data\n", file);
2371+
23782372
return ret;
23792373
}
23802374

0 commit comments

Comments
 (0)