add_table() checks only that the subtable cursor is before the end of
the NFIT before reading the two-field subtable header. A cursor with
fewer than sizeof(struct acpi_nfit_header) bytes remaining therefore
makes the header read cross the mapped table.

The function also advances by the firmware-provided length without
checking that the advertised subtable fits in the enclosing NFIT. A
malformed length can move the parser beyond the table and make the next
iteration read unrelated memory.

Require a complete header and bind the advertised length to both the
header size and the bytes remaining in the NFIT before dispatching the
subtable.

Fixes: b94d5230d06e ("libnvdimm, nfit: initial libnvdimm infrastructure and 
NFIT support")
Assisted-by: Codex:gpt-5
Signed-off-by: Pengpeng Hou <[email protected]>
---
 drivers/acpi/nfit/core.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index cb771d9cadb2..4428adb6a1ab 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -963,14 +963,18 @@ static void *add_table(struct acpi_nfit_desc *acpi_desc,
        struct device *dev = acpi_desc->dev;
        struct acpi_nfit_header *hdr;
        void *err = ERR_PTR(-ENOMEM);
+       size_t table_len;
 
        if (table >= end)
                return NULL;
+       table_len = end - table;
+       if (table_len < sizeof(*hdr))
+               return NULL;
 
        hdr = table;
-       if (!hdr->length) {
-               dev_warn(dev, "found a zero length table '%d' parsing nfit\n",
-                       hdr->type);
+       if (hdr->length < sizeof(*hdr) || hdr->length > table_len) {
+               dev_warn(dev, "invalid table length %u for type %u parsing 
nfit\n",
+                        hdr->length, hdr->type);
                return NULL;
        }
 
-- 
2.50.1 (Apple Git-155)


Reply via email to