diff mbox series

[v3,06/16] i2c: Add a length check to the SMBus write handling

Message ID 20181126200435.23408-7-minyard@acm.org
State New
Headers show
Series [v3,01/16] i2c: Split smbus into parts | expand

Commit Message

Corey Minyard Nov. 26, 2018, 8:04 p.m. UTC
From: Corey Minyard <cminyard@mvista.com>


Avoid an overflow.

Signed-off-by: Corey Minyard <cminyard@mvista.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

---
 hw/i2c/smbus_slave.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

-- 
2.17.1

Comments

Philippe Mathieu-Daudé Nov. 26, 2018, 8:33 p.m. UTC | #1
On 26/11/18 21:04, minyard@acm.org wrote:
> From: Corey Minyard <cminyard@mvista.com>

> 

> Avoid an overflow.

> 

> Signed-off-by: Corey Minyard <cminyard@mvista.com>

> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>


> ---

>  hw/i2c/smbus_slave.c | 6 +++++-

>  1 file changed, 5 insertions(+), 1 deletion(-)

> 

> diff --git a/hw/i2c/smbus_slave.c b/hw/i2c/smbus_slave.c

> index 70ff29c095..d03f714608 100644

> --- a/hw/i2c/smbus_slave.c

> +++ b/hw/i2c/smbus_slave.c

> @@ -182,7 +182,11 @@ static int smbus_i2c_send(I2CSlave *s, uint8_t data)

>      switch (dev->mode) {

>      case SMBUS_WRITE_DATA:

>          DPRINTF("Write data %02x\n", data);

> -        dev->data_buf[dev->data_len++] = data;

> +        if (dev->data_len >= sizeof(dev->data_buf)) {

> +            BADF("Too many bytes sent\n");

> +        } else {

> +            dev->data_buf[dev->data_len++] = data;

> +        }

>          break;

>  

>      default:

>
diff mbox series

Patch

diff --git a/hw/i2c/smbus_slave.c b/hw/i2c/smbus_slave.c
index 70ff29c095..d03f714608 100644
--- a/hw/i2c/smbus_slave.c
+++ b/hw/i2c/smbus_slave.c
@@ -182,7 +182,11 @@  static int smbus_i2c_send(I2CSlave *s, uint8_t data)
     switch (dev->mode) {
     case SMBUS_WRITE_DATA:
         DPRINTF("Write data %02x\n", data);
-        dev->data_buf[dev->data_len++] = data;
+        if (dev->data_len >= sizeof(dev->data_buf)) {
+            BADF("Too many bytes sent\n");
+        } else {
+            dev->data_buf[dev->data_len++] = data;
+        }
         break;
 
     default: