]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fpga: microchip-spi: fix zero header_size OOB read in mpf_ops_parse_header()
authorSebastian Alba Vives <sebasjosue84@gmail.com>
Mon, 18 May 2026 19:07:42 +0000 (13:07 -0600)
committerXu Yilun <yilun.xu@linux.intel.com>
Mon, 1 Jun 2026 04:29:40 +0000 (12:29 +0800)
mpf_ops_parse_header() reads header_size from the bitstream at
MPF_HEADER_SIZE_OFFSET (24). When header_size is zero, the expression
*(buf + header_size - 1) reads one byte before the buffer start.

Since initial_header_size is set to 71 in mpf_ops, the fpga-mgr core
guarantees the buffer is large enough to reach MPF_HEADER_SIZE_OFFSET.
The only real gap is the zero header_size case, which cannot be
resolved by providing a larger buffer, so return -EINVAL.

Fixes: 5f8d4a900830 ("fpga: microchip-spi: add Microchip MPF FPGA manager")
Cc: stable@vger.kernel.org
Signed-off-by: Sebastian Alba Vives <sebasjosue84@gmail.com>
Reviewed-by: Xu Yilun <yilun.xu@intel.com>
Link: https://lore.kernel.org/r/20260518190742.61426-4-sebasjosue84@gmail.com
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
drivers/fpga/microchip-spi.c

index 6134cea86ac8560c76a53d029d143a8235d2675c..cc8f6d7bb9781cd9a9f6109f822201f8a78e4f7a 100644 (file)
@@ -116,6 +116,9 @@ static int mpf_ops_parse_header(struct fpga_manager *mgr,
        }
 
        header_size = *(buf + MPF_HEADER_SIZE_OFFSET);
+       if (!header_size)
+               return -EINVAL;
+
        if (header_size > count) {
                info->header_size = header_size;
                return -EAGAIN;