@@ -647,6 +647,28 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p)
647647 return copy_to_user (p , str , len ) ? - EFAULT : len ;
648648}
649649
650+ static int handle_eviocgbit (struct input_dev * dev , unsigned int cmd , void __user * p , int compat_mode )
651+ {
652+ unsigned long * bits ;
653+ int len ;
654+
655+ switch (_IOC_NR (cmd ) & EV_MAX ) {
656+
657+ case 0 : bits = dev -> evbit ; len = EV_MAX ; break ;
658+ case EV_KEY : bits = dev -> keybit ; len = KEY_MAX ; break ;
659+ case EV_REL : bits = dev -> relbit ; len = REL_MAX ; break ;
660+ case EV_ABS : bits = dev -> absbit ; len = ABS_MAX ; break ;
661+ case EV_MSC : bits = dev -> mscbit ; len = MSC_MAX ; break ;
662+ case EV_LED : bits = dev -> ledbit ; len = LED_MAX ; break ;
663+ case EV_SND : bits = dev -> sndbit ; len = SND_MAX ; break ;
664+ case EV_FF : bits = dev -> ffbit ; len = FF_MAX ; break ;
665+ case EV_SW : bits = dev -> swbit ; len = SW_MAX ; break ;
666+ default : return - EINVAL ;
667+ }
668+ return bits_to_user (bits , len , _IOC_SIZE (cmd ), p , compat_mode );
669+ }
670+
671+
650672static long evdev_do_ioctl (struct file * file , unsigned int cmd ,
651673 void __user * p , int compat_mode )
652674{
@@ -733,26 +755,8 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
733755
734756 if (_IOC_DIR (cmd ) == _IOC_READ ) {
735757
736- if ((_IOC_NR (cmd ) & ~EV_MAX ) == _IOC_NR (EVIOCGBIT (0 , 0 ))) {
737-
738- unsigned long * bits ;
739- int len ;
740-
741- switch (_IOC_NR (cmd ) & EV_MAX ) {
742-
743- case 0 : bits = dev -> evbit ; len = EV_MAX ; break ;
744- case EV_KEY : bits = dev -> keybit ; len = KEY_MAX ; break ;
745- case EV_REL : bits = dev -> relbit ; len = REL_MAX ; break ;
746- case EV_ABS : bits = dev -> absbit ; len = ABS_MAX ; break ;
747- case EV_MSC : bits = dev -> mscbit ; len = MSC_MAX ; break ;
748- case EV_LED : bits = dev -> ledbit ; len = LED_MAX ; break ;
749- case EV_SND : bits = dev -> sndbit ; len = SND_MAX ; break ;
750- case EV_FF : bits = dev -> ffbit ; len = FF_MAX ; break ;
751- case EV_SW : bits = dev -> swbit ; len = SW_MAX ; break ;
752- default : return - EINVAL ;
753- }
754- return bits_to_user (bits , len , _IOC_SIZE (cmd ), p , compat_mode );
755- }
758+ if ((_IOC_NR (cmd ) & ~EV_MAX ) == _IOC_NR (EVIOCGBIT (0 , 0 )))
759+ return handle_eviocgbit (dev , cmd , p , compat_mode );
756760
757761 if (_IOC_NR (cmd ) == _IOC_NR (EVIOCGKEY (0 )))
758762 return bits_to_user (dev -> key , KEY_MAX , _IOC_SIZE (cmd ),
0 commit comments