mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
firmware: arm_scmi: Validate BASE_ERROR_EVENT payload size
BASE_ERROR_EVENT carries a variable number of message reports, with the count encoded in error_status. The notification parser used that count without checking whether the received payload contained all reported entries. Reject truncated payloads before copying the report array. Link: https://patch.msgid.link/20260517-scmi_fixes-v1-2-d86daec4defd@kernel.org Signed-off-by: Sudeep Holla <sudeep.holla@kernel.org>
This commit is contained in:
parent
f6fe7c3c00
commit
56e7e64cdd
|
|
@ -325,6 +325,8 @@ static void *scmi_base_fill_custom_report(const struct scmi_protocol_handle *ph,
|
|||
void *report, u32 *src_id)
|
||||
{
|
||||
int i;
|
||||
u32 error_status;
|
||||
size_t expected_sz;
|
||||
const struct scmi_base_error_notify_payld *p = payld;
|
||||
struct scmi_base_error_report *r = report;
|
||||
|
||||
|
|
@ -338,10 +340,19 @@ static void *scmi_base_fill_custom_report(const struct scmi_protocol_handle *ph,
|
|||
if (evt_id != SCMI_EVENT_BASE_ERROR_EVENT || sizeof(*p) < payld_sz)
|
||||
return NULL;
|
||||
|
||||
expected_sz = offsetof(typeof(*p), msg_reports);
|
||||
if (payld_sz < expected_sz)
|
||||
return NULL;
|
||||
|
||||
r->timestamp = timestamp;
|
||||
r->agent_id = le32_to_cpu(p->agent_id);
|
||||
r->fatal = IS_FATAL_ERROR(le32_to_cpu(p->error_status));
|
||||
r->cmd_count = ERROR_CMD_COUNT(le32_to_cpu(p->error_status));
|
||||
error_status = le32_to_cpu(p->error_status);
|
||||
r->fatal = IS_FATAL_ERROR(error_status);
|
||||
r->cmd_count = ERROR_CMD_COUNT(error_status);
|
||||
expected_sz += r->cmd_count * sizeof(p->msg_reports[0]);
|
||||
if (payld_sz < expected_sz)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < r->cmd_count; i++)
|
||||
r->reports[i] = le64_to_cpu(p->msg_reports[i]);
|
||||
*src_id = 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user