aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_ioc32.c30
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