aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb-frontends/stv0367.c13
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
36static int stvdebug; 39static int stvdebug;
37module_param_named(debug, stvdebug, int, 0644); 40module_param_named(debug, stvdebug, int, 0644);
38 41
@@ -767,7 +770,7 @@ static struct st_register def0367cab[STV0367CAB_NBREGS] = {
767static 770static
768int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len) 771int 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);