aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScotty Bauer <sbauer@eng.utah.edu>2015-12-01 11:11:04 -0700
committerMike Snitzer <snitzer@redhat.com>2016-01-05 16:10:14 -0500
commitead3db62bf10fe143bec99e7b7ff370d7a6d23ef (patch)
tree5a54e9e13d64aec4eebaa98a27bcb7dfc30d1431
parent18d03e8c25f173f4107a40d0b8c24defb6ed69f3 (diff)
downloadlinux-dm-ead3db62bf10fe143bec99e7b7ff370d7a6d23ef.tar.gz
dm ioctl: do not directly deference user memory in check_version()
Notice: this object is not reachable from any branch.
Use copy_from_user() to safely access user-land memory. Signed-off-by: Scotty Bauer <sbauer@eng.utah.edu> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Cc: stable@vger.kernel.org
Notice: this object is not reachable from any branch.
-rw-r--r--drivers/md/dm-ioctl.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 80a4395432596..fa5bf545f0fba 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1642,9 +1642,13 @@ static ioctl_fn lookup_ioctl(unsigned int cmd, int *ioctl_flags)
static int check_version(unsigned int cmd, struct dm_ioctl __user *user)
{
uint32_t version[3];
+ uint32_t __user *versionp;
int r = 0;
- if (copy_from_user(version, user->version, sizeof(version)))
+ if (copy_from_user(&versionp, &user->version, sizeof(versionp)))
+ return -EFAULT;
+
+ if (copy_from_user(version, versionp, sizeof(version)))
return -EFAULT;
if ((DM_VERSION_MAJOR != version[0]) ||
@@ -1663,7 +1667,7 @@ static int check_version(unsigned int cmd, struct dm_ioctl __user *user)
version[0] = DM_VERSION_MAJOR;
version[1] = DM_VERSION_MINOR;
version[2] = DM_VERSION_PATCHLEVEL;
- if (copy_to_user(user->version, version, sizeof(version)))
+ if (copy_to_user(versionp, version, sizeof(version)))
return -EFAULT;
return r;