From 0076f354018a8bc4288b17bc8774a8ff1d1b8e76 Mon Sep 17 00:00:00 2001 From: Catalin Visinescu Date: Wed, 17 Jun 2026 17:33:10 -0400 Subject: [PATCH] drivers/eeprom/i2c_xx24xx: Integer Overflow in I2C EEPROM ee24xx_seek() The function seek which allows the user to move the cursor to a particular offset in order to read and write from EEPROM storage does not validate the offset is valid. Later, this can cause an out-of-bounds reads or writes. Note that newpos may store a large value, larger than the size of the EEPROM. Similar change in the SPI driver. Tested locally, builds fine. Signed-off-by: Catalin Visinescu --- drivers/eeprom/i2c_xx24xx.c | 17 ++++++++++++++++- drivers/eeprom/spi_xx25xx.c | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/eeprom/i2c_xx24xx.c b/drivers/eeprom/i2c_xx24xx.c index 9cdaab9c0ca..fe9ef045a2f 100644 --- a/drivers/eeprom/i2c_xx24xx.c +++ b/drivers/eeprom/i2c_xx24xx.c @@ -570,20 +570,35 @@ static off_t ee24xx_seek(FAR struct file *filep, off_t offset, int whence) return ret; } - /* Determine the new, requested file position */ + /* Determine the new, requested file position + * For EEPROM sparse files are not allowed. + * "offset" can be negative, "newpos" must be between 0 and eedev->size + */ switch (whence) { case SEEK_CUR: newpos = filep->f_pos + offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; case SEEK_SET: newpos = offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; case SEEK_END: newpos = eedev->size + offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; default: diff --git a/drivers/eeprom/spi_xx25xx.c b/drivers/eeprom/spi_xx25xx.c index 4076c186e86..f4bb68dd915 100644 --- a/drivers/eeprom/spi_xx25xx.c +++ b/drivers/eeprom/spi_xx25xx.c @@ -929,20 +929,35 @@ static off_t ee25xx_seek(FAR struct file *filep, off_t offset, int whence) return ret; } - /* Determine the new, requested file position */ + /* Determine the new, requested file position + * For EEPROM sparse files are not allowed. + * "offset" can be negative, "newpos" must be between 0 and eedev->size + */ switch (whence) { case SEEK_CUR: newpos = filep->f_pos + offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; case SEEK_SET: newpos = offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; case SEEK_END: newpos = eedev->size + offset; + if (newpos < 0 || newpos > eedev->size) + { + return -EINVAL; + } break; default: