@@ -2210,9 +2210,14 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
2210
2210
rc = do_chaninfo_ioctl (dev , & it );
2211
2211
break ;
2212
2212
}
2213
- case COMEDI_RANGEINFO :
2214
- rc = do_rangeinfo_ioctl (dev , (void __user * )arg );
2213
+ case COMEDI_RANGEINFO : {
2214
+ struct comedi_rangeinfo it ;
2215
+ if (copy_from_user (& it , (void __user * )arg , sizeof (it )))
2216
+ rc = - EFAULT ;
2217
+ else
2218
+ rc = do_rangeinfo_ioctl (dev , & it );
2215
2219
break ;
2220
+ }
2216
2221
case COMEDI_BUFINFO :
2217
2222
rc = do_bufinfo_ioctl (dev ,
2218
2223
(struct comedi_bufinfo __user * )arg ,
@@ -2900,32 +2905,22 @@ static int compat_chaninfo(struct file *file, unsigned long arg)
2900
2905
/* Handle 32-bit COMEDI_RANGEINFO ioctl. */
2901
2906
static int compat_rangeinfo (struct file * file , unsigned long arg )
2902
2907
{
2903
- struct comedi_rangeinfo __user * rangeinfo ;
2904
- struct comedi32_rangeinfo_struct __user * rangeinfo32 ;
2908
+ struct comedi_file * cfp = file -> private_data ;
2909
+ struct comedi_device * dev = cfp -> dev ;
2910
+ struct comedi32_rangeinfo_struct rangeinfo32 ;
2911
+ struct comedi_rangeinfo rangeinfo ;
2905
2912
int err ;
2906
- union {
2907
- unsigned int uint ;
2908
- compat_uptr_t uptr ;
2909
- } temp ;
2910
-
2911
- rangeinfo32 = compat_ptr (arg );
2912
- rangeinfo = compat_alloc_user_space (sizeof (* rangeinfo ));
2913
2913
2914
- /* Copy rangeinfo structure. */
2915
- if (!access_ok (rangeinfo32 , sizeof (* rangeinfo32 )) ||
2916
- !access_ok (rangeinfo , sizeof (* rangeinfo )))
2914
+ if (copy_from_user (& rangeinfo32 , compat_ptr (arg ), sizeof (rangeinfo32 )))
2917
2915
return - EFAULT ;
2916
+ memset (& rangeinfo , 0 , sizeof (rangeinfo ));
2917
+ rangeinfo .range_type = rangeinfo32 .range_type ;
2918
+ rangeinfo .range_ptr = compat_ptr (rangeinfo32 .range_ptr );
2918
2919
2919
- err = 0 ;
2920
- err |= __get_user (temp .uint , & rangeinfo32 -> range_type );
2921
- err |= __put_user (temp .uint , & rangeinfo -> range_type );
2922
- err |= __get_user (temp .uptr , & rangeinfo32 -> range_ptr );
2923
- err |= __put_user (compat_ptr (temp .uptr ), & rangeinfo -> range_ptr );
2924
- if (err )
2925
- return - EFAULT ;
2926
-
2927
- return comedi_unlocked_ioctl (file , COMEDI_RANGEINFO ,
2928
- (unsigned long )rangeinfo );
2920
+ mutex_lock (& dev -> mutex );
2921
+ err = do_rangeinfo_ioctl (dev , & rangeinfo );
2922
+ mutex_unlock (& dev -> mutex );
2923
+ return err ;
2929
2924
}
2930
2925
2931
2926
/* Copy 32-bit cmd structure to native cmd structure. */
0 commit comments