Skip to content

Commit 3fb43a7

Browse files
ian-abbottgregkh
authored andcommitted
comedi: me4000: Fix potential overrun of firmware buffer
`me4000_xilinx_download()` loads the firmware that was requested by `request_firmware()`. It is possible for it to overrun the source buffer because it blindly trusts the file format. It reads a data stream length from the first 4 bytes into variable `file_length` and reads the data stream contents of length `file_length` from offset 16 onwards. Add a test to ensure that the supplied firmware is long enough to contain the header and the data stream. On failure, log an error and return `-EINVAL`. Note: The firmware loading was totally broken before commit ac584af ("staging: comedi: me4000: fix firmware downloading"), but that is the most sensible target for this fix. Fixes: ac584af ("staging: comedi: me4000: fix firmware downloading") Cc: stable <stable@kernel.org> Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Link: https://patch.msgid.link/20260205133949.71722-1-abbotti@mev.co.uk Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 101ab94 commit 3fb43a7

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

drivers/comedi/drivers/me4000.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,18 @@ static int me4000_xilinx_download(struct comedi_device *dev,
315315
unsigned int val;
316316
unsigned int i;
317317

318+
/* Get data stream length from header. */
319+
if (size >= 4) {
320+
file_length = (((unsigned int)data[0] & 0xff) << 24) +
321+
(((unsigned int)data[1] & 0xff) << 16) +
322+
(((unsigned int)data[2] & 0xff) << 8) +
323+
((unsigned int)data[3] & 0xff);
324+
}
325+
if (size < 16 || file_length > size - 16) {
326+
dev_err(dev->class_dev, "Firmware length inconsistency\n");
327+
return -EINVAL;
328+
}
329+
318330
if (!xilinx_iobase)
319331
return -ENODEV;
320332

@@ -346,10 +358,6 @@ static int me4000_xilinx_download(struct comedi_device *dev,
346358
outl(val, devpriv->plx_regbase + PLX9052_CNTRL);
347359

348360
/* Download Xilinx firmware */
349-
file_length = (((unsigned int)data[0] & 0xff) << 24) +
350-
(((unsigned int)data[1] & 0xff) << 16) +
351-
(((unsigned int)data[2] & 0xff) << 8) +
352-
((unsigned int)data[3] & 0xff);
353361
usleep_range(10, 1000);
354362

355363
for (i = 0; i < file_length; i++) {

0 commit comments

Comments
 (0)