Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

+9 -1
+9 -1
drivers/media/usb/dvb-usb/dibusb-common.c
··· 12 12 #include <linux/kconfig.h> 13 13 #include "dibusb.h" 14 14 15 + /* Max transfer size done by I2C transfer functions */ 16 + #define MAX_XFER_SIZE 64 17 + 15 18 static int debug; 16 19 module_param(debug, int, 0644); 17 20 MODULE_PARM_DESC(debug, "set debugging level (1=info (|-able))." DVB_USB_DEBUG_STATUS); ··· 108 105 static int dibusb_i2c_msg(struct dvb_usb_device *d, u8 addr, 109 106 u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen) 110 107 { 111 - u8 sndbuf[wlen+4]; /* lead(1) devaddr,direction(1) addr(2) data(wlen) (len(2) (when reading)) */ 108 + u8 sndbuf[MAX_XFER_SIZE]; /* lead(1) devaddr,direction(1) addr(2) data(wlen) (len(2) (when reading)) */ 112 109 /* write only ? */ 113 110 int wo = (rbuf == NULL || rlen == 0), 114 111 len = 2 + wlen + (wo ? 0 : 2); 112 + 113 + if (4 + wlen > sizeof(sndbuf)) { 114 + warn("i2c wr: len=%d is too big!\n", wlen); 115 + return -EOPNOTSUPP; 116 + } 115 117 116 118 sndbuf[0] = wo ? DIBUSB_REQ_I2C_WRITE : DIBUSB_REQ_I2C_READ; 117 119 sndbuf[1] = (addr << 1) | (wo ? 0 : 1);