summaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/dvb-core/dvb_demux.c
diff options
context:
space:
mode:
authorAl Viro2008-06-22 19:20:19 +0200
committerMauro Carvalho Chehab2008-07-20 12:13:27 +0200
commit947a080037c6ae47cfe5072eadbd189e3da27ecd (patch)
treea6529d111edf7570146c6be6b524e4e84215fd07 /drivers/media/dvb/dvb-core/dvb_demux.c
parentV4L/DVB (8130): split dvb_ringbuffer dual-use functions (diff)
downloadkernel-qcow2-linux-947a080037c6ae47cfe5072eadbd189e3da27ecd.tar.gz
kernel-qcow2-linux-947a080037c6ae47cfe5072eadbd189e3da27ecd.tar.xz
kernel-qcow2-linux-947a080037c6ae47cfe5072eadbd189e3da27ecd.zip
V4L/DVB (8131): dmx_write: memcpy from user-supplied pointer
... copy to kernel memory first Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/dvb-core/dvb_demux.c')
-rw-r--r--drivers/media/dvb/dvb-core/dvb_demux.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c
index 934e15fffc56..e2eca0b1fe7c 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c
@@ -1056,16 +1056,27 @@ static int dvbdmx_close(struct dmx_demux *demux)
return 0;
}
-static int dvbdmx_write(struct dmx_demux *demux, const char *buf, size_t count)
+static int dvbdmx_write(struct dmx_demux *demux, const char __user *buf, size_t count)
{
struct dvb_demux *dvbdemux = (struct dvb_demux *)demux;
+ void *p;
if ((!demux->frontend) || (demux->frontend->source != DMX_MEMORY_FE))
return -EINVAL;
- if (mutex_lock_interruptible(&dvbdemux->mutex))
+ p = kmalloc(count, GFP_USER);
+ if (!p)
+ return -ENOMEM;
+ if (copy_from_user(p, buf, count)) {
+ kfree(p);
+ return -EFAULT;
+ }
+ if (mutex_lock_interruptible(&dvbdemux->mutex)) {
+ kfree(p);
return -ERESTARTSYS;
- dvb_dmx_swfilter(dvbdemux, (u8 *)buf, count);
+ }
+ dvb_dmx_swfilter(dvbdemux, p, count);
+ kfree(p);
mutex_unlock(&dvbdemux->mutex);
if (signal_pending(current))