diff options
-rw-r--r-- | drivers/gpu/drm/drm_ioc32.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c index b0d882022a1f..b986caa66430 100644 --- a/drivers/gpu/drm/drm_ioc32.c +++ b/drivers/gpu/drm/drm_ioc32.c | |||
@@ -761,23 +761,19 @@ static int compat_drm_sg_alloc(struct file *file, unsigned int cmd, | |||
761 | unsigned long arg) | 761 | unsigned long arg) |
762 | { | 762 | { |
763 | drm_scatter_gather32_t __user *argp = (void __user *)arg; | 763 | drm_scatter_gather32_t __user *argp = (void __user *)arg; |
764 | struct drm_scatter_gather __user *request; | 764 | struct drm_scatter_gather request; |
765 | int err; | 765 | int err; |
766 | unsigned long x; | ||
767 | 766 | ||
768 | request = compat_alloc_user_space(sizeof(*request)); | 767 | if (get_user(request.size, &argp->size)) |
769 | if (!request || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) | ||
770 | || __get_user(x, &argp->size) | ||
771 | || __put_user(x, &request->size)) | ||
772 | return -EFAULT; | 768 | return -EFAULT; |
773 | 769 | ||
774 | err = drm_ioctl(file, DRM_IOCTL_SG_ALLOC, (unsigned long)request); | 770 | err = drm_ioctl_kernel(file, drm_legacy_sg_alloc, &request, |
771 | DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY); | ||
775 | if (err) | 772 | if (err) |
776 | return err; | 773 | return err; |
777 | 774 | ||
778 | /* XXX not sure about the handle conversion here... */ | 775 | /* XXX not sure about the handle conversion here... */ |
779 | if (__get_user(x, &request->handle) | 776 | if (put_user(request.handle >> PAGE_SHIFT, &argp->handle)) |
780 | || __put_user(x >> PAGE_SHIFT, &argp->handle)) | ||
781 | return -EFAULT; | 777 | return -EFAULT; |
782 | 778 | ||
783 | return 0; | 779 | return 0; |
@@ -787,16 +783,14 @@ static int compat_drm_sg_free(struct file *file, unsigned int cmd, | |||
787 | unsigned long arg) | 783 | unsigned long arg) |
788 | { | 784 | { |
789 | drm_scatter_gather32_t __user *argp = (void __user *)arg; | 785 | drm_scatter_gather32_t __user *argp = (void __user *)arg; |
790 | struct drm_scatter_gather __user *request; | 786 | struct drm_scatter_gather request; |
791 | unsigned long x; | 787 | unsigned long x; |
792 | 788 | ||
793 | request = compat_alloc_user_space(sizeof(*request)); | 789 | if (get_user(x, &argp->handle)) |
794 | if (!request || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) | ||
795 | || __get_user(x, &argp->handle) | ||
796 | || __put_user(x << PAGE_SHIFT, &request->handle)) | ||
797 | return -EFAULT; | 790 | return -EFAULT; |
798 | 791 | request.handle = x << PAGE_SHIFT; | |
799 | return drm_ioctl(file, DRM_IOCTL_SG_FREE, (unsigned long)request); | 792 | return drm_ioctl_kernel(file, drm_legacy_sg_free, &request, |
793 | DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY); | ||
800 | } | 794 | } |
801 | 795 | ||
802 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) | 796 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) |
@@ -972,8 +966,8 @@ static struct { | |||
972 | DRM_IOCTL32_DEF(DRM_IOCTL_AGP_BIND, compat_drm_agp_bind), | 966 | DRM_IOCTL32_DEF(DRM_IOCTL_AGP_BIND, compat_drm_agp_bind), |
973 | DRM_IOCTL32_DEF(DRM_IOCTL_AGP_UNBIND, compat_drm_agp_unbind), | 967 | DRM_IOCTL32_DEF(DRM_IOCTL_AGP_UNBIND, compat_drm_agp_unbind), |
974 | #endif | 968 | #endif |
975 | [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC32)].fn = compat_drm_sg_alloc, | 969 | DRM_IOCTL32_DEF(DRM_IOCTL_SG_ALLOC, compat_drm_sg_alloc), |
976 | [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE32)].fn = compat_drm_sg_free, | 970 | DRM_IOCTL32_DEF(DRM_IOCTL_SG_FREE, compat_drm_sg_free), |
977 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) | 971 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) |
978 | [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)].fn = compat_drm_update_draw, | 972 | [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)].fn = compat_drm_update_draw, |
979 | #endif | 973 | #endif |