From: Hans Verkuil <hverkuil-ci...@xs4all.nl>

[ Upstream commit 7c3bae3f430af6b4fcbdb7272e191e266fd94b45 ]

If the v4l2_ctrl_g_ctrl*() or __v4l2_ctrl_s_ctrl*() functions
are called for the wrong control type then they call WARN_ON
since that is a driver error. But they still continue, potentially
overwriting data. Change this to return an error (s_ctrl) or 0
(g_ctrl), just to be safe.

Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c 
b/drivers/media/v4l2-core/v4l2-ctrls.c
index 93d33d1db4e8..452edd06d67d 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -3794,7 +3794,8 @@ s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
        struct v4l2_ext_control c;
 
        /* It's a driver bug if this happens. */
-       WARN_ON(!ctrl->is_int);
+       if (WARN_ON(!ctrl->is_int))
+               return 0;
        c.value = 0;
        get_ctrl(ctrl, &c);
        return c.value;
@@ -3806,7 +3807,8 @@ s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
        struct v4l2_ext_control c;
 
        /* It's a driver bug if this happens. */
-       WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
+       if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64))
+               return 0;
        c.value64 = 0;
        get_ctrl(ctrl, &c);
        return c.value64;
@@ -4215,7 +4217,8 @@ int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
        lockdep_assert_held(ctrl->handler->lock);
 
        /* It's a driver bug if this happens. */
-       WARN_ON(!ctrl->is_int);
+       if (WARN_ON(!ctrl->is_int))
+               return -EINVAL;
        ctrl->val = val;
        return set_ctrl(NULL, ctrl, 0);
 }
@@ -4226,7 +4229,8 @@ int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 
val)
        lockdep_assert_held(ctrl->handler->lock);
 
        /* It's a driver bug if this happens. */
-       WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64);
+       if (WARN_ON(ctrl->is_ptr || ctrl->type != V4L2_CTRL_TYPE_INTEGER64))
+               return -EINVAL;
        *ctrl->p_new.p_s64 = val;
        return set_ctrl(NULL, ctrl, 0);
 }
@@ -4237,7 +4241,8 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, 
const char *s)
        lockdep_assert_held(ctrl->handler->lock);
 
        /* It's a driver bug if this happens. */
-       WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING);
+       if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_STRING))
+               return -EINVAL;
        strscpy(ctrl->p_new.p_char, s, ctrl->maximum + 1);
        return set_ctrl(NULL, ctrl, 0);
 }
@@ -4249,7 +4254,8 @@ int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
        lockdep_assert_held(ctrl->handler->lock);
 
        /* It's a driver bug if this happens. */
-       WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA);
+       if (WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA))
+               return -EINVAL;
        *ctrl->p_new.p_area = *area;
        return set_ctrl(NULL, ctrl, 0);
 }
-- 
2.25.1



Reply via email to