From: Hans Verkuil <[email protected]>

copy_to/from_user returns the number of bytes not copied, it does not
return a 'normal' linux error code.

Signed-off-by: Hans Verkuil <[email protected]>
---
 drivers/media/v4l2-core/v4l2-ctrls.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c 
b/drivers/media/v4l2-core/v4l2-ctrls.c
index c55cabb..1886b79 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1292,7 +1292,8 @@ static int ptr_to_user(struct v4l2_ext_control *c,
        u32 len;
 
        if (ctrl->is_ptr && !ctrl->is_string)
-               return copy_to_user(c->p, ptr.p, c->size);
+               return copy_to_user(c->p, ptr.p, c->size) ?
+                      -EFAULT : 0;
 
        switch (ctrl->type) {
        case V4L2_CTRL_TYPE_STRING:
@@ -1302,7 +1303,7 @@ static int ptr_to_user(struct v4l2_ext_control *c,
                        return -ENOSPC;
                }
                return copy_to_user(c->string, ptr.p_char, len + 1) ?
-                                                               -EFAULT : 0;
+                      -EFAULT : 0;
        case V4L2_CTRL_TYPE_INTEGER64:
                c->value64 = *ptr.p_s64;
                break;
@@ -1339,7 +1340,7 @@ static int user_to_ptr(struct v4l2_ext_control *c,
        if (ctrl->is_ptr && !ctrl->is_string) {
                unsigned idx;
 
-               ret = copy_from_user(ptr.p, c->p, c->size);
+               ret = copy_from_user(ptr.p, c->p, c->size) ? -EFAULT : 0;
                if (ret || !ctrl->is_matrix)
                        return ret;
                for (idx = c->size / ctrl->elem_size;
@@ -1358,7 +1359,7 @@ static int user_to_ptr(struct v4l2_ext_control *c,
                        return -ERANGE;
                if (size > ctrl->maximum + 1)
                        size = ctrl->maximum + 1;
-               ret = copy_from_user(ptr.p_char, c->string, size);
+               ret = copy_from_user(ptr.p_char, c->string, size) ? -EFAULT : 0;
                if (!ret) {
                        char last = ptr.p_char[size - 1];
 
@@ -1368,7 +1369,7 @@ static int user_to_ptr(struct v4l2_ext_control *c,
                        if (strlen(ptr.p_char) == ctrl->maximum && last)
                                return -ERANGE;
                }
-               return ret ? -EFAULT : 0;
+               return ret;
        default:
                *ptr.p_s32 = c->value;
                break;
-- 
1.8.4.rc3

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to