diff options
-rw-r--r-- | drivers/media/dvb-frontends/stv090x.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c index 56d470ad5a82..23e872f84742 100644 --- a/drivers/media/dvb-frontends/stv090x.c +++ b/drivers/media/dvb-frontends/stv090x.c | |||
@@ -35,6 +35,9 @@ | |||
35 | #include "stv090x.h" | 35 | #include "stv090x.h" |
36 | #include "stv090x_priv.h" | 36 | #include "stv090x_priv.h" |
37 | 37 | ||
38 | /* Max transfer size done by I2C transfer functions */ | ||
39 | #define MAX_XFER_SIZE 64 | ||
40 | |||
38 | static unsigned int verbose; | 41 | static unsigned int verbose; |
39 | module_param(verbose, int, 0644); | 42 | module_param(verbose, int, 0644); |
40 | 43 | ||
@@ -722,9 +725,16 @@ static int stv090x_write_regs(struct stv090x_state *state, unsigned int reg, u8 | |||
722 | { | 725 | { |
723 | const struct stv090x_config *config = state->config; | 726 | const struct stv090x_config *config = state->config; |
724 | int ret; | 727 | int ret; |
725 | u8 buf[2 + count]; | 728 | u8 buf[MAX_XFER_SIZE]; |
726 | struct i2c_msg i2c_msg = { .addr = config->address, .flags = 0, .buf = buf, .len = 2 + count }; | 729 | struct i2c_msg i2c_msg = { .addr = config->address, .flags = 0, .buf = buf, .len = 2 + count }; |
727 | 730 | ||
731 | if (2 + count > sizeof(buf)) { | ||
732 | printk(KERN_WARNING | ||
733 | "%s: i2c wr reg=%04x: len=%d is too big!\n", | ||
734 | KBUILD_MODNAME, reg, count); | ||
735 | return -EINVAL; | ||
736 | } | ||
737 | |||
728 | buf[0] = reg >> 8; | 738 | buf[0] = reg >> 8; |
729 | buf[1] = reg & 0xff; | 739 | buf[1] = reg & 0xff; |
730 | memcpy(&buf[2], data, count); | 740 | memcpy(&buf[2], data, count); |