mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
ACPI: extlog: Validate PCIe error section length before payload access
extlog_print_pcie() reads pcie_err->validation_bits and device_id and
copies the 96-byte aer_info buffer without checking that
gdata->error_data_length is big enough for a struct cper_sec_pcie. The
cper_estatus_check() call added earlier keeps the read inside the estatus
block, but a short section still gets stale adjacent bytes treated as PCIe
error data.
Reject a section too small to hold the record before touching any field,
and warn: a truncated section means firmware is emitting malformed records.
Reported-by: sashiko-bot@kernel.org
Closes: https://lore.kernel.org/linux-cxl/20260709165457.8BA181F000E9@smtp.kernel.org/
Fixes: e778ffefa3 ("ACPI: extlog: Trace CPER PCI Express Error Section")
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://patch.msgid.link/20260904172337.1409775-7-dave.jiang@intel.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
31333d134a
commit
5eefd849e2
|
|
@ -134,7 +134,7 @@ static int print_extlog_rcd(const char *pfx,
|
|||
}
|
||||
|
||||
static void extlog_print_pcie(struct cper_sec_pcie *pcie_err,
|
||||
int severity)
|
||||
int severity, u32 len)
|
||||
{
|
||||
#ifdef ACPI_APEI_PCIEAER
|
||||
struct aer_capability_regs aer_regs = {};
|
||||
|
|
@ -144,6 +144,12 @@ static void extlog_print_pcie(struct cper_sec_pcie *pcie_err,
|
|||
int aer_severity;
|
||||
int domain;
|
||||
|
||||
if (len < sizeof(*pcie_err)) {
|
||||
pr_warn_ratelimited(FW_WARN
|
||||
"PCIe error section too small (%u)\n", len);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
|
||||
pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO))
|
||||
return;
|
||||
|
|
@ -246,7 +252,8 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
|
|||
} else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
|
||||
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
|
||||
|
||||
extlog_print_pcie(pcie_err, gdata->error_severity);
|
||||
extlog_print_pcie(pcie_err, gdata->error_severity,
|
||||
gdata->error_data_length);
|
||||
} else {
|
||||
void *err = acpi_hest_get_payload(gdata);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user