]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.18.85/media-v4l2-ctrl-fix-flags-field-on-control-events.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.18.85 / media-v4l2-ctrl-fix-flags-field-on-control-events.patch
CommitLineData
f71f4658
GKH
1From 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f Mon Sep 17 00:00:00 2001
2From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
3Date: Tue, 17 Oct 2017 11:48:50 -0400
4Subject: media: v4l2-ctrl: Fix flags field on Control events
5
6From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
7
8commit 9cac9d2fb2fe0e0cadacdb94415b3fe49e3f724f upstream.
9
10VIDIOC_DQEVENT and VIDIOC_QUERY_EXT_CTRL should give the same output for
11the control flags field.
12
13This patch creates a new function user_flags(), that calculates the user
14exported flags value (which is different than the kernel internal flags
15structure). This function is then used by all the code that exports the
16internal flags to userspace.
17
18Reported-by: Dimitrios Katsaros <patcherwork@gmail.com>
19Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
20Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
21Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
22Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23
24---
25 drivers/media/v4l2-core/v4l2-ctrls.c | 16 ++++++++++++----
26 1 file changed, 12 insertions(+), 4 deletions(-)
27
28--- a/drivers/media/v4l2-core/v4l2-ctrls.c
29+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
30@@ -1196,6 +1196,16 @@ void v4l2_ctrl_fill(u32 id, const char *
31 }
32 EXPORT_SYMBOL(v4l2_ctrl_fill);
33
34+static u32 user_flags(const struct v4l2_ctrl *ctrl)
35+{
36+ u32 flags = ctrl->flags;
37+
38+ if (ctrl->is_ptr)
39+ flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
40+
41+ return flags;
42+}
43+
44 static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes)
45 {
46 memset(ev->reserved, 0, sizeof(ev->reserved));
47@@ -1203,7 +1213,7 @@ static void fill_event(struct v4l2_event
48 ev->id = ctrl->id;
49 ev->u.ctrl.changes = changes;
50 ev->u.ctrl.type = ctrl->type;
51- ev->u.ctrl.flags = ctrl->flags;
52+ ev->u.ctrl.flags = user_flags(ctrl);
53 if (ctrl->is_ptr)
54 ev->u.ctrl.value64 = 0;
55 else
56@@ -2540,10 +2550,8 @@ int v4l2_query_ext_ctrl(struct v4l2_ctrl
57 else
58 qc->id = ctrl->id;
59 strlcpy(qc->name, ctrl->name, sizeof(qc->name));
60- qc->flags = ctrl->flags;
61+ qc->flags = user_flags(ctrl);
62 qc->type = ctrl->type;
63- if (ctrl->is_ptr)
64- qc->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
65 qc->elem_size = ctrl->elem_size;
66 qc->elems = ctrl->elems;
67 qc->nr_of_dims = ctrl->nr_of_dims;