]> git.itanic.dy.fi Git - linux-stable/commitdiff
cxl/pci: Handle truncated CDAT header
authorLukas Wunner <lukas@wunner.de>
Sat, 11 Mar 2023 14:40:02 +0000 (15:40 +0100)
committerDan Williams <dan.j.williams@intel.com>
Mon, 3 Apr 2023 23:16:19 +0000 (16:16 -0700)
cxl_cdat_get_length() only checks whether the DOE response size is
sufficient for the Table Access response header (1 dword), but not the
succeeding CDAT header (1 dword length plus other fields).

It thus returns whatever uninitialized memory happens to be on the stack
if a truncated DOE response with only 1 dword was received.  Fix it.

Fixes: c97006046c79 ("cxl/port: Read CDAT table")
Reported-by: Ming Li <ming4.li@intel.com>
Tested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Reviewed-by: Ming Li <ming4.li@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: stable@vger.kernel.org # v6.0+
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Link: https://lore.kernel.org/r/000e69cd163461c8b1bc2cf4155b6e25402c29c7.1678543498.git.lukas@wunner.de
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/pci.c

index 49a99a84b6aa6de3ae6518450da7ff504fe1c1b2..87da8c935185a562d3525f023f3e1ea13e25e70b 100644 (file)
@@ -510,7 +510,7 @@ static int cxl_cdat_get_length(struct device *dev,
                return rc;
        }
        wait_for_completion(&t.c);
-       if (t.task.rv < sizeof(__le32))
+       if (t.task.rv < 2 * sizeof(__le32))
                return -EIO;
 
        *length = le32_to_cpu(t.response_pl[1]);