[PATCH v3 04/10] ACPI: extlog: Avoid populating software AER metadata from raw hardware buffer
Dave Jiang <[email protected]>
| Newsgroups | org.kernel.vger.linux-cxl,org.kernel.vger.linux-acpi |
|---|---|
| Message-ID | <[email protected]> |
sashiko-bot flagged that casting the raw aer_info buffer fills software-only AER metadata with hardware data, driving an out-of-bounds read. extlog_print_pcie() casts pcie_err->aer_info directly to struct aer_capability_regs *. That struct embeds struct pcie_tlp_log, whose software-only header_len and flit fields sit at offset 84, within the 96-byte aer_info buffer, so the cast fills them with raw hardware data. pcie_print_tlp_log() uses flit and header_len to bound a loop over the dw[] array, so a large header_len walks past its end. Copy aer_info into a zeroed local struct aer_capability_regs and clear header_len and flit before passing it on. Reported-by: [email protected] Fixes: e778ffefa34d ("ACPI: extlog: Trace CPER PCI Express Error Section") Link: https://lore.kernel.org/linux-cxl/[email protected]/ Assisted-by: Claude:claude-sonnet-4-6 Signed-off-by: Dave Jiang <[email protected]> --- drivers/acpi/acpi_extlog.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/acpi/acpi_extlog.c b/drivers/acpi/acpi_extlog.c index 06a944dadbc1..fbc88c584c06 100644 --- a/drivers/acpi/acpi_extlog.c +++ b/drivers/acpi/acpi_extlog.c @@ -137,6 +137,7 @@ static void extlog_print_pcie(struct cper_sec_pcie *pcie_err, int severity) { #ifdef ACPI_APEI_PCIEAER + struct aer_capability_regs aer_regs = {}; struct aer_capability_regs *aer; struct pci_dev *pdev; unsigned int devfn; @@ -149,7 +150,12 @@ static void extlog_print_pcie(struct cper_sec_pcie *pcie_err, return; aer_severity = cper_severity_to_aer(severity); - aer = (struct aer_capability_regs *)pcie_err->aer_info; + + memcpy(&aer_regs, pcie_err->aer_info, sizeof(pcie_err->aer_info)); + aer_regs.header_log.header_len = 0; + aer_regs.header_log.flit = false; + aer = &aer_regs; + domain = pcie_err->device_id.segment; bus = pcie_err->device_id.bus; devfn = PCI_DEVFN(pcie_err->device_id.device, -- 2.55.0