diff options
Diffstat (limited to 'drivers/media/dvb-frontends/af9033.c')
-rw-r--r-- | drivers/media/dvb-frontends/af9033.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c index a777b4b944eb..65728c25ea05 100644 --- a/drivers/media/dvb-frontends/af9033.c +++ b/drivers/media/dvb-frontends/af9033.c | |||
@@ -21,6 +21,9 @@ | |||
21 | 21 | ||
22 | #include "af9033_priv.h" | 22 | #include "af9033_priv.h" |
23 | 23 | ||
24 | /* Max transfer size done by I2C transfer functions */ | ||
25 | #define MAX_XFER_SIZE 64 | ||
26 | |||
24 | struct af9033_state { | 27 | struct af9033_state { |
25 | struct i2c_adapter *i2c; | 28 | struct i2c_adapter *i2c; |
26 | struct dvb_frontend fe; | 29 | struct dvb_frontend fe; |
@@ -40,16 +43,23 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val, | |||
40 | int len) | 43 | int len) |
41 | { | 44 | { |
42 | int ret; | 45 | int ret; |
43 | u8 buf[3 + len]; | 46 | u8 buf[MAX_XFER_SIZE]; |
44 | struct i2c_msg msg[1] = { | 47 | struct i2c_msg msg[1] = { |
45 | { | 48 | { |
46 | .addr = state->cfg.i2c_addr, | 49 | .addr = state->cfg.i2c_addr, |
47 | .flags = 0, | 50 | .flags = 0, |
48 | .len = sizeof(buf), | 51 | .len = 3 + len, |
49 | .buf = buf, | 52 | .buf = buf, |
50 | } | 53 | } |
51 | }; | 54 | }; |
52 | 55 | ||
56 | if (3 + len > sizeof(buf)) { | ||
57 | dev_warn(&state->i2c->dev, | ||
58 | "%s: i2c wr reg=%04x: len=%d is too big!\n", | ||
59 | KBUILD_MODNAME, reg, len); | ||
60 | return -EINVAL; | ||
61 | } | ||
62 | |||
53 | buf[0] = (reg >> 16) & 0xff; | 63 | buf[0] = (reg >> 16) & 0xff; |
54 | buf[1] = (reg >> 8) & 0xff; | 64 | buf[1] = (reg >> 8) & 0xff; |
55 | buf[2] = (reg >> 0) & 0xff; | 65 | buf[2] = (reg >> 0) & 0xff; |
@@ -160,11 +170,18 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val, | |||
160 | static int af9033_wr_reg_val_tab(struct af9033_state *state, | 170 | static int af9033_wr_reg_val_tab(struct af9033_state *state, |
161 | const struct reg_val *tab, int tab_len) | 171 | const struct reg_val *tab, int tab_len) |
162 | { | 172 | { |
173 | #define MAX_TAB_LEN 212 | ||
163 | int ret, i, j; | 174 | int ret, i, j; |
164 | u8 buf[tab_len]; | 175 | u8 buf[1 + MAX_TAB_LEN]; |
165 | 176 | ||
166 | dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); | 177 | dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); |
167 | 178 | ||
179 | if (tab_len > sizeof(buf)) { | ||
180 | dev_warn(&state->i2c->dev, "%s: tab len %d is too big\n", | ||
181 | KBUILD_MODNAME, tab_len); | ||
182 | return -EINVAL; | ||
183 | } | ||
184 | |||
168 | for (i = 0, j = 0; i < tab_len; i++) { | 185 | for (i = 0, j = 0; i < tab_len; i++) { |
169 | buf[j] = tab[i].val; | 186 | buf[j] = tab[i].val; |
170 | 187 | ||