aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2013-11-02 04:05:18 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-11-08 06:45:38 -0500
commit8393796dfa4cf5dffcceec464c7789bec3a2f471 (patch)
treef8410ce34146d3f4ef8bbcfb109328ea245c5574
parent9736a89dafe07359d9c86bf9c3b815a250b354bc (diff)
[media] dvb-frontends: Don't use dynamic static allocation
Dynamic static allocation is evil, as Kernel stack is too low, and compilation complains about it on some archs: drivers/media/dvb-frontends/bcm3510.c:230:1: warning: 'bcm3510_do_hab_cmd' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/itd1000.c:69:1: warning: 'itd1000_write_regs.constprop.0' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/mt312.c:126:1: warning: 'mt312_write' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/nxt200x.c:111:1: warning: 'nxt200x_writebytes' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/stb6100.c:216:1: warning: 'stb6100_write_reg_range.constprop.3' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/stv6110.c:98:1: warning: 'stv6110_write_regs' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/stv6110x.c:85:1: warning: 'stv6110x_write_regs' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/tda18271c2dd.c:147:1: warning: 'WriteRegs' uses dynamic stack allocation [enabled by default] drivers/media/dvb-frontends/zl10039.c:119:1: warning: 'zl10039_write' uses dynamic stack allocation [enabled by default] Instead, let's enforce a limit for the buffer. Considering that I2C transfers are generally limited, and that devices used on USB has a max data length of 64 bytes for the control URBs. So, it seem safe to use 64 bytes as the hard limit for all those devices. On most cases, the limit is a way lower than that, but this limit is small enough to not affect the Kernel stack, and it is a no brain limit, as using smaller ones would require to either carefully each driver or to take a look on each datasheet. Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com> Reviewed-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/dvb-frontends/bcm3510.c15
-rw-r--r--drivers/media/dvb-frontends/itd1000.c13
-rw-r--r--drivers/media/dvb-frontends/mt312.c10
-rw-r--r--drivers/media/dvb-frontends/nxt200x.c11
-rw-r--r--drivers/media/dvb-frontends/stb6100.c11
-rw-r--r--drivers/media/dvb-frontends/stv6110.c12
-rw-r--r--drivers/media/dvb-frontends/stv6110x.c13
-rw-r--r--drivers/media/dvb-frontends/tda18271c2dd.c14
-rw-r--r--drivers/media/dvb-frontends/zl10039.c12
9 files changed, 101 insertions, 10 deletions
diff --git a/drivers/media/dvb-frontends/bcm3510.c b/drivers/media/dvb-frontends/bcm3510.c
index 1b77909c0c71..39a29dd29519 100644
--- a/drivers/media/dvb-frontends/bcm3510.c
+++ b/drivers/media/dvb-frontends/bcm3510.c
@@ -44,6 +44,9 @@
44#include "bcm3510.h" 44#include "bcm3510.h"
45#include "bcm3510_priv.h" 45#include "bcm3510_priv.h"
46 46
47/* Max transfer size done by bcm3510_do_hab_cmd() function */
48#define MAX_XFER_SIZE 128
49
47struct bcm3510_state { 50struct bcm3510_state {
48 51
49 struct i2c_adapter* i2c; 52 struct i2c_adapter* i2c;
@@ -201,9 +204,19 @@ static int bcm3510_hab_send_request(struct bcm3510_state *st, u8 *buf, int len)
201 204
202static int bcm3510_do_hab_cmd(struct bcm3510_state *st, u8 cmd, u8 msgid, u8 *obuf, u8 olen, u8 *ibuf, u8 ilen) 205static int bcm3510_do_hab_cmd(struct bcm3510_state *st, u8 cmd, u8 msgid, u8 *obuf, u8 olen, u8 *ibuf, u8 ilen)
203{ 206{
204 u8 ob[olen+2],ib[ilen+2]; 207 u8 ob[MAX_XFER_SIZE], ib[MAX_XFER_SIZE];
205 int ret = 0; 208 int ret = 0;
206 209
210 if (ilen + 2 > sizeof(ib)) {
211 deb_hab("do_hab_cmd: ilen=%d is too big!\n", ilen);
212 return -EINVAL;
213 }
214
215 if (olen + 2 > sizeof(ob)) {
216 deb_hab("do_hab_cmd: olen=%d is too big!\n", olen);
217 return -EINVAL;
218 }
219
207 ob[0] = cmd; 220 ob[0] = cmd;
208 ob[1] = msgid; 221 ob[1] = msgid;
209 memcpy(&ob[2],obuf,olen); 222 memcpy(&ob[2],obuf,olen);
diff --git a/drivers/media/dvb-frontends/itd1000.c b/drivers/media/dvb-frontends/itd1000.c
index c1c3400b2173..cadcae4cff89 100644
--- a/drivers/media/dvb-frontends/itd1000.c
+++ b/drivers/media/dvb-frontends/itd1000.c
@@ -31,6 +31,9 @@
31#include "itd1000.h" 31#include "itd1000.h"
32#include "itd1000_priv.h" 32#include "itd1000_priv.h"
33 33
34/* Max transfer size done by I2C transfer functions */
35#define MAX_XFER_SIZE 64
36
34static int debug; 37static int debug;
35module_param(debug, int, 0644); 38module_param(debug, int, 0644);
36MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); 39MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
@@ -52,10 +55,18 @@ MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
52/* don't write more than one byte with flexcop behind */ 55/* don't write more than one byte with flexcop behind */
53static int itd1000_write_regs(struct itd1000_state *state, u8 reg, u8 v[], u8 len) 56static int itd1000_write_regs(struct itd1000_state *state, u8 reg, u8 v[], u8 len)
54{ 57{
55 u8 buf[1+len]; 58 u8 buf[MAX_XFER_SIZE];
56 struct i2c_msg msg = { 59 struct i2c_msg msg = {
57 .addr = state->cfg->i2c_address, .flags = 0, .buf = buf, .len = len+1 60 .addr = state->cfg->i2c_address, .flags = 0, .buf = buf, .len = len+1
58 }; 61 };
62
63 if (1 + len > sizeof(buf)) {
64 printk(KERN_WARNING
65 "itd1000: i2c wr reg=%04x: len=%d is too big!\n",
66 reg, len);
67 return -EINVAL;
68 }
69
59 buf[0] = reg; 70 buf[0] = reg;
60 memcpy(&buf[1], v, len); 71 memcpy(&buf[1], v, len);
61 72
diff --git a/drivers/media/dvb-frontends/mt312.c b/drivers/media/dvb-frontends/mt312.c
index ec388c1d6913..a74ac0ddb833 100644
--- a/drivers/media/dvb-frontends/mt312.c
+++ b/drivers/media/dvb-frontends/mt312.c
@@ -36,6 +36,8 @@
36#include "mt312_priv.h" 36#include "mt312_priv.h"
37#include "mt312.h" 37#include "mt312.h"
38 38
39/* Max transfer size done by I2C transfer functions */
40#define MAX_XFER_SIZE 64
39 41
40struct mt312_state { 42struct mt312_state {
41 struct i2c_adapter *i2c; 43 struct i2c_adapter *i2c;
@@ -96,9 +98,15 @@ static int mt312_write(struct mt312_state *state, const enum mt312_reg_addr reg,
96 const u8 *src, const size_t count) 98 const u8 *src, const size_t count)
97{ 99{
98 int ret; 100 int ret;
99 u8 buf[count + 1]; 101 u8 buf[MAX_XFER_SIZE];
100 struct i2c_msg msg; 102 struct i2c_msg msg;
101 103
104 if (1 + count > sizeof(buf)) {
105 printk(KERN_WARNING
106 "mt312: write: len=%zd is too big!\n", count);
107 return -EINVAL;
108 }
109
102 if (debug) { 110 if (debug) {
103 int i; 111 int i;
104 dprintk("W(%d):", reg & 0x7f); 112 dprintk("W(%d):", reg & 0x7f);
diff --git a/drivers/media/dvb-frontends/nxt200x.c b/drivers/media/dvb-frontends/nxt200x.c
index 8e288940a61f..fbca9856313a 100644
--- a/drivers/media/dvb-frontends/nxt200x.c
+++ b/drivers/media/dvb-frontends/nxt200x.c
@@ -39,6 +39,9 @@
39 */ 39 */
40#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 40#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
41 41
42/* Max transfer size done by I2C transfer functions */
43#define MAX_XFER_SIZE 64
44
42#define NXT2002_DEFAULT_FIRMWARE "dvb-fe-nxt2002.fw" 45#define NXT2002_DEFAULT_FIRMWARE "dvb-fe-nxt2002.fw"
43#define NXT2004_DEFAULT_FIRMWARE "dvb-fe-nxt2004.fw" 46#define NXT2004_DEFAULT_FIRMWARE "dvb-fe-nxt2004.fw"
44#define CRC_CCIT_MASK 0x1021 47#define CRC_CCIT_MASK 0x1021
@@ -95,10 +98,16 @@ static int i2c_readbytes(struct nxt200x_state *state, u8 addr, u8 *buf, u8 len)
95static int nxt200x_writebytes (struct nxt200x_state* state, u8 reg, 98static int nxt200x_writebytes (struct nxt200x_state* state, u8 reg,
96 const u8 *buf, u8 len) 99 const u8 *buf, u8 len)
97{ 100{
98 u8 buf2 [len+1]; 101 u8 buf2[MAX_XFER_SIZE];
99 int err; 102 int err;
100 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf2, .len = len + 1 }; 103 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf2, .len = len + 1 };
101 104
105 if (1 + len > sizeof(buf2)) {
106 pr_warn("%s: i2c wr reg=%04x: len=%d is too big!\n",
107 __func__, reg, len);
108 return -EINVAL;
109 }
110
102 buf2[0] = reg; 111 buf2[0] = reg;
103 memcpy(&buf2[1], buf, len); 112 memcpy(&buf2[1], buf, len);
104 113
diff --git a/drivers/media/dvb-frontends/stb6100.c b/drivers/media/dvb-frontends/stb6100.c
index 45f9523f968f..cea175d19890 100644
--- a/drivers/media/dvb-frontends/stb6100.c
+++ b/drivers/media/dvb-frontends/stb6100.c
@@ -31,6 +31,8 @@
31static unsigned int verbose; 31static unsigned int verbose;
32module_param(verbose, int, 0644); 32module_param(verbose, int, 0644);
33 33
34/* Max transfer size done by I2C transfer functions */
35#define MAX_XFER_SIZE 64
34 36
35#define FE_ERROR 0 37#define FE_ERROR 0
36#define FE_NOTICE 1 38#define FE_NOTICE 1
@@ -183,7 +185,7 @@ static int stb6100_read_reg(struct stb6100_state *state, u8 reg)
183static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len) 185static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len)
184{ 186{
185 int rc; 187 int rc;
186 u8 cmdbuf[len + 1]; 188 u8 cmdbuf[MAX_XFER_SIZE];
187 struct i2c_msg msg = { 189 struct i2c_msg msg = {
188 .addr = state->config->tuner_address, 190 .addr = state->config->tuner_address,
189 .flags = 0, 191 .flags = 0,
@@ -191,6 +193,13 @@ static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int st
191 .len = len + 1 193 .len = len + 1
192 }; 194 };
193 195
196 if (1 + len > sizeof(buf)) {
197 printk(KERN_WARNING
198 "%s: i2c wr: len=%d is too big!\n",
199 KBUILD_MODNAME, len);
200 return -EINVAL;
201 }
202
194 if (unlikely(start < 1 || start + len > STB6100_NUMREGS)) { 203 if (unlikely(start < 1 || start + len > STB6100_NUMREGS)) {
195 dprintk(verbose, FE_ERROR, 1, "Invalid register range %d:%d", 204 dprintk(verbose, FE_ERROR, 1, "Invalid register range %d:%d",
196 start, len); 205 start, len);
diff --git a/drivers/media/dvb-frontends/stv6110.c b/drivers/media/dvb-frontends/stv6110.c
index 20b5fa92c53e..b1425830a24e 100644
--- a/drivers/media/dvb-frontends/stv6110.c
+++ b/drivers/media/dvb-frontends/stv6110.c
@@ -30,6 +30,9 @@
30 30
31#include "stv6110.h" 31#include "stv6110.h"
32 32
33/* Max transfer size done by I2C transfer functions */
34#define MAX_XFER_SIZE 64
35
33static int debug; 36static int debug;
34 37
35struct stv6110_priv { 38struct stv6110_priv {
@@ -68,7 +71,7 @@ static int stv6110_write_regs(struct dvb_frontend *fe, u8 buf[],
68{ 71{
69 struct stv6110_priv *priv = fe->tuner_priv; 72 struct stv6110_priv *priv = fe->tuner_priv;
70 int rc; 73 int rc;
71 u8 cmdbuf[len + 1]; 74 u8 cmdbuf[MAX_XFER_SIZE];
72 struct i2c_msg msg = { 75 struct i2c_msg msg = {
73 .addr = priv->i2c_address, 76 .addr = priv->i2c_address,
74 .flags = 0, 77 .flags = 0,
@@ -78,6 +81,13 @@ static int stv6110_write_regs(struct dvb_frontend *fe, u8 buf[],
78 81
79 dprintk("%s\n", __func__); 82 dprintk("%s\n", __func__);
80 83
84 if (1 + len > sizeof(cmdbuf)) {
85 printk(KERN_WARNING
86 "%s: i2c wr: len=%d is too big!\n",
87 KBUILD_MODNAME, len);
88 return -EINVAL;
89 }
90
81 if (start + len > 8) 91 if (start + len > 8)
82 return -EINVAL; 92 return -EINVAL;
83 93
diff --git a/drivers/media/dvb-frontends/stv6110x.c b/drivers/media/dvb-frontends/stv6110x.c
index f36cab12bdc7..e66154e5c1d7 100644
--- a/drivers/media/dvb-frontends/stv6110x.c
+++ b/drivers/media/dvb-frontends/stv6110x.c
@@ -32,6 +32,9 @@
32#include "stv6110x.h" 32#include "stv6110x.h"
33#include "stv6110x_priv.h" 33#include "stv6110x_priv.h"
34 34
35/* Max transfer size done by I2C transfer functions */
36#define MAX_XFER_SIZE 64
37
35static unsigned int verbose; 38static unsigned int verbose;
36module_param(verbose, int, 0644); 39module_param(verbose, int, 0644);
37MODULE_PARM_DESC(verbose, "Set Verbosity level"); 40MODULE_PARM_DESC(verbose, "Set Verbosity level");
@@ -61,7 +64,8 @@ static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 da
61{ 64{
62 int ret; 65 int ret;
63 const struct stv6110x_config *config = stv6110x->config; 66 const struct stv6110x_config *config = stv6110x->config;
64 u8 buf[len + 1]; 67 u8 buf[MAX_XFER_SIZE];
68
65 struct i2c_msg msg = { 69 struct i2c_msg msg = {
66 .addr = config->addr, 70 .addr = config->addr,
67 .flags = 0, 71 .flags = 0,
@@ -69,6 +73,13 @@ static int stv6110x_write_regs(struct stv6110x_state *stv6110x, int start, u8 da
69 .len = len + 1 73 .len = len + 1
70 }; 74 };
71 75
76 if (1 + len > sizeof(buf)) {
77 printk(KERN_WARNING
78 "%s: i2c wr: len=%d is too big!\n",
79 KBUILD_MODNAME, len);
80 return -EINVAL;
81 }
82
72 if (start + len > 8) 83 if (start + len > 8)
73 return -EINVAL; 84 return -EINVAL;
74 85
diff --git a/drivers/media/dvb-frontends/tda18271c2dd.c b/drivers/media/dvb-frontends/tda18271c2dd.c
index d281f77d5c28..2c54586ac07f 100644
--- a/drivers/media/dvb-frontends/tda18271c2dd.c
+++ b/drivers/media/dvb-frontends/tda18271c2dd.c
@@ -34,6 +34,9 @@
34#include "dvb_frontend.h" 34#include "dvb_frontend.h"
35#include "tda18271c2dd.h" 35#include "tda18271c2dd.h"
36 36
37/* Max transfer size done by I2C transfer functions */
38#define MAX_XFER_SIZE 64
39
37struct SStandardParam { 40struct SStandardParam {
38 s32 m_IFFrequency; 41 s32 m_IFFrequency;
39 u32 m_BandWidth; 42 u32 m_BandWidth;
@@ -139,11 +142,18 @@ static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
139static int WriteRegs(struct tda_state *state, 142static int WriteRegs(struct tda_state *state,
140 u8 SubAddr, u8 *Regs, u16 nRegs) 143 u8 SubAddr, u8 *Regs, u16 nRegs)
141{ 144{
142 u8 data[nRegs+1]; 145 u8 data[MAX_XFER_SIZE];
146
147 if (1 + nRegs > sizeof(data)) {
148 printk(KERN_WARNING
149 "%s: i2c wr: len=%d is too big!\n",
150 KBUILD_MODNAME, nRegs);
151 return -EINVAL;
152 }
143 153
144 data[0] = SubAddr; 154 data[0] = SubAddr;
145 memcpy(data + 1, Regs, nRegs); 155 memcpy(data + 1, Regs, nRegs);
146 return i2c_write(state->i2c, state->adr, data, nRegs+1); 156 return i2c_write(state->i2c, state->adr, data, nRegs + 1);
147} 157}
148 158
149static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg) 159static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg)
diff --git a/drivers/media/dvb-frontends/zl10039.c b/drivers/media/dvb-frontends/zl10039.c
index eff9c5fde50a..91b6b2e9b792 100644
--- a/drivers/media/dvb-frontends/zl10039.c
+++ b/drivers/media/dvb-frontends/zl10039.c
@@ -30,6 +30,9 @@
30 30
31static int debug; 31static int debug;
32 32
33/* Max transfer size done by I2C transfer functions */
34#define MAX_XFER_SIZE 64
35
33#define dprintk(args...) \ 36#define dprintk(args...) \
34 do { \ 37 do { \
35 if (debug) \ 38 if (debug) \
@@ -98,7 +101,7 @@ static int zl10039_write(struct zl10039_state *state,
98 const enum zl10039_reg_addr reg, const u8 *src, 101 const enum zl10039_reg_addr reg, const u8 *src,
99 const size_t count) 102 const size_t count)
100{ 103{
101 u8 buf[count + 1]; 104 u8 buf[MAX_XFER_SIZE];
102 struct i2c_msg msg = { 105 struct i2c_msg msg = {
103 .addr = state->i2c_addr, 106 .addr = state->i2c_addr,
104 .flags = 0, 107 .flags = 0,
@@ -106,6 +109,13 @@ static int zl10039_write(struct zl10039_state *state,
106 .len = count + 1, 109 .len = count + 1,
107 }; 110 };
108 111
112 if (1 + count > sizeof(buf)) {
113 printk(KERN_WARNING
114 "%s: i2c wr reg=%04x: len=%zd is too big!\n",
115 KBUILD_MODNAME, reg, count);
116 return -EINVAL;
117 }
118
109 dprintk("%s\n", __func__); 119 dprintk("%s\n", __func__);
110 /* Write register address and data in one go */ 120 /* Write register address and data in one go */
111 buf[0] = reg; 121 buf[0] = reg;