diff options
-rw-r--r-- | drivers/media/dvb-frontends/stv0367.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/media/dvb-frontends/stv0367.c b/drivers/media/dvb-frontends/stv0367.c index 0c8e45949b11..f6c7277999fe 100644 --- a/drivers/media/dvb-frontends/stv0367.c +++ b/drivers/media/dvb-frontends/stv0367.c | |||
@@ -33,6 +33,9 @@ | |||
33 | #include "stv0367_regs.h" | 33 | #include "stv0367_regs.h" |
34 | #include "stv0367_priv.h" | 34 | #include "stv0367_priv.h" |
35 | 35 | ||
36 | /* Max transfer size done by I2C transfer functions */ | ||
37 | #define MAX_XFER_SIZE 64 | ||
38 | |||
36 | static int stvdebug; | 39 | static int stvdebug; |
37 | module_param_named(debug, stvdebug, int, 0644); | 40 | module_param_named(debug, stvdebug, int, 0644); |
38 | 41 | ||
@@ -767,7 +770,7 @@ static struct st_register def0367cab[STV0367CAB_NBREGS] = { | |||
767 | static | 770 | static |
768 | int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len) | 771 | int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len) |
769 | { | 772 | { |
770 | u8 buf[len + 2]; | 773 | u8 buf[MAX_XFER_SIZE]; |
771 | struct i2c_msg msg = { | 774 | struct i2c_msg msg = { |
772 | .addr = state->config->demod_address, | 775 | .addr = state->config->demod_address, |
773 | .flags = 0, | 776 | .flags = 0, |
@@ -776,6 +779,14 @@ int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len) | |||
776 | }; | 779 | }; |
777 | int ret; | 780 | int ret; |
778 | 781 | ||
782 | if (2 + len > sizeof(buf)) { | ||
783 | printk(KERN_WARNING | ||
784 | "%s: i2c wr reg=%04x: len=%d is too big!\n", | ||
785 | KBUILD_MODNAME, reg, len); | ||
786 | return -EINVAL; | ||
787 | } | ||
788 | |||
789 | |||
779 | buf[0] = MSB(reg); | 790 | buf[0] = MSB(reg); |
780 | buf[1] = LSB(reg); | 791 | buf[1] = LSB(reg); |
781 | memcpy(buf + 2, data, len); | 792 | memcpy(buf + 2, data, len); |