summaryrefslogtreecommitdiff
path: root/drivers/media/video/ivtv/ivtv-vbi.c
diff options
context:
space:
mode:
authorAndy Walls <awalls@md.metrocast.net>2010-12-19 21:59:56 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 08:17:10 -0200
commitddda424999817fbc17adf9013feb066903382ede (patch)
tree1f75abf4d6a4814519b74fce450296cd495ba56e /drivers/media/video/ivtv/ivtv-vbi.c
parentb0c45686c8e8aecc7b0cd04d9b6af48d74418d53 (diff)
[media] ivtv: Return EFAULT when copy_from_user() fails in ivtv_write_vbi_from_user()
If write() on a VBI device node fails due to a bad buffer pointer from userspace, we should notify the application properly with EFAULT, per the V4L2 API spec. Signed-off-by: Andy Walls <awalls@md.metrocast.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-vbi.c')
-rw-r--r--drivers/media/video/ivtv/ivtv-vbi.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/media/video/ivtv/ivtv-vbi.c b/drivers/media/video/ivtv/ivtv-vbi.c
index 7275f2d6597e..2dfa957b0fd5 100644
--- a/drivers/media/video/ivtv/ivtv-vbi.c
+++ b/drivers/media/video/ivtv/ivtv-vbi.c
@@ -157,24 +157,30 @@ static void ivtv_write_vbi(struct ivtv *itv,
ivtv_write_vbi_cc_lines(itv, &cc);
}
-void ivtv_write_vbi_from_user(struct ivtv *itv,
- const struct v4l2_sliced_vbi_data __user *sliced,
- size_t cnt)
+ssize_t
+ivtv_write_vbi_from_user(struct ivtv *itv,
+ const struct v4l2_sliced_vbi_data __user *sliced,
+ size_t cnt)
{
struct vbi_cc cc = { .odd = { 0x80, 0x80 }, .even = { 0x80, 0x80 } };
int found_cc = 0;
size_t i;
struct v4l2_sliced_vbi_data d;
+ ssize_t ret = cnt * sizeof(struct v4l2_sliced_vbi_data);
for (i = 0; i < cnt; i++) {
if (copy_from_user(&d, sliced + i,
- sizeof(struct v4l2_sliced_vbi_data)))
+ sizeof(struct v4l2_sliced_vbi_data))) {
+ ret = -EFAULT;
break;
+ }
ivtv_write_vbi_line(itv, sliced + i, &cc, &found_cc);
}
if (found_cc)
ivtv_write_vbi_cc_lines(itv, &cc);
+
+ return ret;
}
static void copy_vbi_data(struct ivtv *itv, int lines, u32 pts_stamp)