Commit effc3466 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (8920): cx18/ivtv: fix check of window boundaries for VIDIOC_S_FMT

It was possible to set out-of-bounds windows sizes, this is now
fixed.
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ff5f26b4
...@@ -171,7 +171,6 @@ static int cx18_try_fmt_vid_cap(struct file *file, void *fh, ...@@ -171,7 +171,6 @@ static int cx18_try_fmt_vid_cap(struct file *file, void *fh,
{ {
struct cx18_open_id *id = fh; struct cx18_open_id *id = fh;
struct cx18 *cx = id->cx; struct cx18 *cx = id->cx;
int w = fmt->fmt.pix.width; int w = fmt->fmt.pix.width;
int h = fmt->fmt.pix.height; int h = fmt->fmt.pix.height;
...@@ -203,8 +202,7 @@ static int cx18_s_fmt_vid_cap(struct file *file, void *fh, ...@@ -203,8 +202,7 @@ static int cx18_s_fmt_vid_cap(struct file *file, void *fh,
struct cx18_open_id *id = fh; struct cx18_open_id *id = fh;
struct cx18 *cx = id->cx; struct cx18 *cx = id->cx;
int ret; int ret;
int w = fmt->fmt.pix.width; int w, h;
int h = fmt->fmt.pix.height;
ret = v4l2_prio_check(&cx->prio, &id->prio); ret = v4l2_prio_check(&cx->prio, &id->prio);
if (ret) if (ret)
...@@ -213,6 +211,8 @@ static int cx18_s_fmt_vid_cap(struct file *file, void *fh, ...@@ -213,6 +211,8 @@ static int cx18_s_fmt_vid_cap(struct file *file, void *fh,
ret = cx18_try_fmt_vid_cap(file, fh, fmt); ret = cx18_try_fmt_vid_cap(file, fh, fmt);
if (ret) if (ret)
return ret; return ret;
w = fmt->fmt.pix.width;
h = fmt->fmt.pix.height;
if (cx->params.width == w && cx->params.height == h) if (cx->params.width == w && cx->params.height == h)
return 0; return 0;
......
...@@ -512,27 +512,20 @@ static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_ ...@@ -512,27 +512,20 @@ static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_
static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt) static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
{ {
struct ivtv_open_id *id = fh; struct ivtv_open_id *id = fh;
s32 w, h; s32 w = fmt->fmt.pix.width;
int field; s32 h = fmt->fmt.pix.height;
int ret; int field = fmt->fmt.pix.field;
int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
w = fmt->fmt.pix.width;
h = fmt->fmt.pix.height;
field = fmt->fmt.pix.field;
ret = ivtv_g_fmt_vid_out(file, fh, fmt);
fmt->fmt.pix.width = w;
fmt->fmt.pix.height = h;
if (!ret && id->type == IVTV_DEC_STREAM_TYPE_YUV) { if (!ret && id->type == IVTV_DEC_STREAM_TYPE_YUV) {
fmt->fmt.pix.field = field; fmt->fmt.pix.field = field;
if (fmt->fmt.pix.width < 2) w = min(w, 720);
fmt->fmt.pix.width = 2; w = max(w, 2);
if (fmt->fmt.pix.width > 720) h = min(h, 576);
fmt->fmt.pix.width = 720; h = max(h, 2);
if (fmt->fmt.pix.height < 2)
fmt->fmt.pix.height = 2;
if (fmt->fmt.pix.height > 576)
fmt->fmt.pix.height = 576;
} }
fmt->fmt.pix.width = w;
fmt->fmt.pix.height = h;
return ret; return ret;
} }
...@@ -560,9 +553,9 @@ static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f ...@@ -560,9 +553,9 @@ static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f
struct ivtv_open_id *id = fh; struct ivtv_open_id *id = fh;
struct ivtv *itv = id->itv; struct ivtv *itv = id->itv;
struct cx2341x_mpeg_params *p = &itv->params; struct cx2341x_mpeg_params *p = &itv->params;
int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
int w = fmt->fmt.pix.width; int w = fmt->fmt.pix.width;
int h = fmt->fmt.pix.height; int h = fmt->fmt.pix.height;
int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment