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

media: dvb-usb-v2/gl861: ensure USB message buffers DMA'able

i2c message buf might be on stack.

Signed-off-by: Akihiro Tsukada <tskd08@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

authored by

Akihiro Tsukada and committed by
Mauro Carvalho Chehab
86f65c21 87360e68

+17 -3
+17 -3
drivers/media/usb/dvb-usb-v2/gl861.c
··· 20 20 u16 value = addr << (8 + 1); 21 21 int wo = (rbuf == NULL || rlen == 0); /* write-only */ 22 22 u8 req, type; 23 + u8 *buf; 24 + int ret; 23 25 24 26 if (wo) { 25 27 req = GL861_REQ_I2C_WRITE; ··· 44 42 KBUILD_MODNAME, wlen); 45 43 return -EINVAL; 46 44 } 47 - 45 + buf = NULL; 46 + if (rlen > 0) { 47 + buf = kmalloc(rlen, GFP_KERNEL); 48 + if (!buf) 49 + return -ENOMEM; 50 + } 48 51 usleep_range(1000, 2000); /* avoid I2C errors */ 49 52 50 - return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, 51 - value, index, rbuf, rlen, 2000); 53 + ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, 54 + value, index, buf, rlen, 2000); 55 + if (rlen > 0) { 56 + if (ret > 0) 57 + memcpy(rbuf, buf, rlen); 58 + kfree(buf); 59 + } 60 + 61 + return ret; 52 62 } 53 63 54 64 /* I2C */