]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: s3c24xx: check the size of the SMBUS message before using it
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 23 Feb 2026 17:05:15 +0000 (18:05 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Wed, 25 Mar 2026 17:13:39 +0000 (18:13 +0100)
The first byte of an i2c SMBUS message is the size, and it should be
verified to ensure that it is in the range of 0..I2C_SMBUS_BLOCK_MAX
before processing it.

This is the same logic that was added in commit a6e04f05ce0b ("i2c:
tegra: check msg length in SMBUS block read") to the i2c tegra driver.

Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Andi Shyti <andi.shyti@kernel.org>
Cc: stable <stable@kernel.org>
Assisted-by: gkh_clanker_2000
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/2026022314-rely-scrubbed-4839@gregkh
drivers/i2c/busses/i2c-s3c2410.c

index 8138f5ef40f06b7f2a3a2e5201d49ad32bc560e9..15e14a6fe6dce97ddd5d049b405ed7707fc12dff 100644 (file)
@@ -503,8 +503,13 @@ static void i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
                i2c->msg->buf[i2c->msg_ptr++] = byte;
 
                /* Add actual length to read for smbus block read */
-               if (i2c->msg->flags & I2C_M_RECV_LEN && i2c->msg->len == 1)
+               if (i2c->msg->flags & I2C_M_RECV_LEN && i2c->msg->len == 1) {
+                       if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX) {
+                               s3c24xx_i2c_stop(i2c, -EPROTO);
+                               break;
+                       }
                        i2c->msg->len += byte;
+               }
  prepare_read:
                if (is_msglast(i2c)) {
                        /* last byte of buffer */