diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2014-06-10 14:07:38 +0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-17 18:57:20 +0400 |
commit | 40265bbe42933920684136ff759e6340eaf72774 (patch) | |
tree | 7566409f2c875815afb771437dc5e22fbedc08e4 /drivers/media/v4l2-core/v4l2-ctrls.c | |
parent | c336f75e1e822658122b96d874da01f5f4df994d (diff) | |
download | linux-40265bbe42933920684136ff759e6340eaf72774.tar.xz |
[media] v4l2-ctrl: fix error return of copy_to/from_user
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 <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ctrls.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ctrls.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index e6e33b3110fa..1086ae3f9152 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -1326,7 +1326,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->ptr, ptr.p, c->size); + return copy_to_user(c->ptr, ptr.p, c->size) ? + -EFAULT : 0; switch (ctrl->type) { case V4L2_CTRL_TYPE_STRING: @@ -1336,7 +1337,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; @@ -1373,7 +1374,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->ptr, c->size); + ret = copy_from_user(ptr.p, c->ptr, c->size) ? -EFAULT : 0; if (ret || !ctrl->is_array) return ret; for (idx = c->size / ctrl->elem_size; idx < ctrl->elems; idx++) @@ -1391,7 +1392,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]; @@ -1401,7 +1402,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; |