[media] dibusb-common: 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/usb/dvb-usb/dibusb-common.c:124:1: warning: 'dibusb_i2c_msg' uses dynamic stack allocation [enabled by default] Instead, let's enforce a limit for the buffer to be the max size of a control URB payload data (64 bytes). 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>
This commit is contained in:
parent
64f7ef8afb
commit
1d7fa359d4
|
@ -12,6 +12,9 @@
|
||||||
#include <linux/kconfig.h>
|
#include <linux/kconfig.h>
|
||||||
#include "dibusb.h"
|
#include "dibusb.h"
|
||||||
|
|
||||||
|
/* Max transfer size done by I2C transfer functions */
|
||||||
|
#define MAX_XFER_SIZE 64
|
||||||
|
|
||||||
static int debug;
|
static int debug;
|
||||||
module_param(debug, int, 0644);
|
module_param(debug, int, 0644);
|
||||||
MODULE_PARM_DESC(debug, "set debugging level (1=info (|-able))." DVB_USB_DEBUG_STATUS);
|
MODULE_PARM_DESC(debug, "set debugging level (1=info (|-able))." DVB_USB_DEBUG_STATUS);
|
||||||
|
@ -105,11 +108,16 @@ EXPORT_SYMBOL(dibusb2_0_power_ctrl);
|
||||||
static int dibusb_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
static int dibusb_i2c_msg(struct dvb_usb_device *d, u8 addr,
|
||||||
u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
|
u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
|
||||||
{
|
{
|
||||||
u8 sndbuf[wlen+4]; /* lead(1) devaddr,direction(1) addr(2) data(wlen) (len(2) (when reading)) */
|
u8 sndbuf[MAX_XFER_SIZE]; /* lead(1) devaddr,direction(1) addr(2) data(wlen) (len(2) (when reading)) */
|
||||||
/* write only ? */
|
/* write only ? */
|
||||||
int wo = (rbuf == NULL || rlen == 0),
|
int wo = (rbuf == NULL || rlen == 0),
|
||||||
len = 2 + wlen + (wo ? 0 : 2);
|
len = 2 + wlen + (wo ? 0 : 2);
|
||||||
|
|
||||||
|
if (4 + wlen > sizeof(sndbuf)) {
|
||||||
|
warn("i2c wr: len=%d is too big!\n", wlen);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
sndbuf[0] = wo ? DIBUSB_REQ_I2C_WRITE : DIBUSB_REQ_I2C_READ;
|
sndbuf[0] = wo ? DIBUSB_REQ_I2C_WRITE : DIBUSB_REQ_I2C_READ;
|
||||||
sndbuf[1] = (addr << 1) | (wo ? 0 : 1);
|
sndbuf[1] = (addr << 1) | (wo ? 0 : 1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue