Loading drivers/input/evdev.c +58 −55 Original line number Diff line number Diff line Loading @@ -534,24 +534,19 @@ static int handle_eviocgbit(struct input_dev *dev, } #undef OLD_KEY_MAX static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p, size_t size) static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; struct input_keymap_entry ke = { .len = sizeof(unsigned int), .flags = 0, }; int __user *ip = (int __user *)p; int error; memset(&ke, 0, sizeof(ke)); if (size == sizeof(unsigned int[2])) { /* legacy case */ int __user *ip = (int __user *)p; if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) return -EFAULT; ke.len = sizeof(unsigned int); ke.flags = 0; error = input_get_keycode(dev, &ke); if (error) return error; Loading @@ -559,31 +554,33 @@ static int evdev_handle_get_keycode(struct input_dev *dev, if (put_user(ke.keycode, ip + 1)) return -EFAULT; } else { size = min(size, sizeof(ke)); return 0; } static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; int error; if (copy_from_user(&ke, p, size)) if (copy_from_user(&ke, p, sizeof(ke))) return -EFAULT; error = input_get_keycode(dev, &ke); if (error) return error; if (copy_to_user(p, &ke, size)) if (copy_to_user(p, &ke, sizeof(ke))) return -EFAULT; } return 0; } static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p, size_t size) static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; memset(&ke, 0, sizeof(ke)); if (size == sizeof(unsigned int[2])) { /* legacy case */ struct input_keymap_entry ke = { .len = sizeof(unsigned int), .flags = 0, }; int __user *ip = (int __user *)p; if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) Loading @@ -592,18 +589,18 @@ static int evdev_handle_set_keycode(struct input_dev *dev, if (get_user(ke.keycode, ip + 1)) return -EFAULT; ke.len = sizeof(unsigned int); ke.flags = 0; return input_set_keycode(dev, &ke); } } else { size = min(size, sizeof(ke)); static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; if (copy_from_user(&ke, p, size)) if (copy_from_user(&ke, p, sizeof(ke))) return -EFAULT; if (ke.len > sizeof(ke.scancode)) return -EINVAL; } return input_set_keycode(dev, &ke); } Loading Loading @@ -669,6 +666,18 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, return evdev_grab(evdev, client); else return evdev_ungrab(evdev, client); case EVIOCGKEYCODE: return evdev_handle_get_keycode(dev, p); case EVIOCSKEYCODE: return evdev_handle_set_keycode(dev, p); case EVIOCGKEYCODE_V2: return evdev_handle_get_keycode_v2(dev, p); case EVIOCSKEYCODE_V2: return evdev_handle_set_keycode_v2(dev, p); } size = _IOC_SIZE(cmd); Loading Loading @@ -708,12 +717,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, return -EFAULT; return error; case EVIOC_MASK_SIZE(EVIOCGKEYCODE): return evdev_handle_get_keycode(dev, p, size); case EVIOC_MASK_SIZE(EVIOCSKEYCODE): return evdev_handle_set_keycode(dev, p, size); } /* Multi-number variable-length handlers */ Loading drivers/input/tablet/wacom_wac.c +3 −0 Original line number Diff line number Diff line Loading @@ -1436,6 +1436,8 @@ static struct wacom_features wacom_features_0xD2 = { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xD3 = { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static const struct wacom_features wacom_features_0xD4 = { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 255, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xD8 = { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xDA = Loading Loading @@ -1510,6 +1512,7 @@ const struct usb_device_id wacom_ids[] = { { USB_DEVICE_WACOM(0xD1) }, { USB_DEVICE_WACOM(0xD2) }, { USB_DEVICE_WACOM(0xD3) }, { USB_DEVICE_WACOM(0xD4) }, { USB_DEVICE_WACOM(0xD8) }, { USB_DEVICE_WACOM(0xDA) }, { USB_DEVICE_WACOM(0xDB) }, Loading include/linux/input.h +4 −2 Original line number Diff line number Diff line Loading @@ -104,8 +104,10 @@ struct input_keymap_entry { #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ #define EVIOCGKEYCODE _IOR('E', 0x04, struct input_keymap_entry) /* get keycode */ #define EVIOCSKEYCODE _IOW('E', 0x04, struct input_keymap_entry) /* set keycode */ #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ #define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry) #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ #define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry) #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ Loading Loading
drivers/input/evdev.c +58 −55 Original line number Diff line number Diff line Loading @@ -534,24 +534,19 @@ static int handle_eviocgbit(struct input_dev *dev, } #undef OLD_KEY_MAX static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p, size_t size) static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; struct input_keymap_entry ke = { .len = sizeof(unsigned int), .flags = 0, }; int __user *ip = (int __user *)p; int error; memset(&ke, 0, sizeof(ke)); if (size == sizeof(unsigned int[2])) { /* legacy case */ int __user *ip = (int __user *)p; if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) return -EFAULT; ke.len = sizeof(unsigned int); ke.flags = 0; error = input_get_keycode(dev, &ke); if (error) return error; Loading @@ -559,31 +554,33 @@ static int evdev_handle_get_keycode(struct input_dev *dev, if (put_user(ke.keycode, ip + 1)) return -EFAULT; } else { size = min(size, sizeof(ke)); return 0; } static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; int error; if (copy_from_user(&ke, p, size)) if (copy_from_user(&ke, p, sizeof(ke))) return -EFAULT; error = input_get_keycode(dev, &ke); if (error) return error; if (copy_to_user(p, &ke, size)) if (copy_to_user(p, &ke, sizeof(ke))) return -EFAULT; } return 0; } static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p, size_t size) static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; memset(&ke, 0, sizeof(ke)); if (size == sizeof(unsigned int[2])) { /* legacy case */ struct input_keymap_entry ke = { .len = sizeof(unsigned int), .flags = 0, }; int __user *ip = (int __user *)p; if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) Loading @@ -592,18 +589,18 @@ static int evdev_handle_set_keycode(struct input_dev *dev, if (get_user(ke.keycode, ip + 1)) return -EFAULT; ke.len = sizeof(unsigned int); ke.flags = 0; return input_set_keycode(dev, &ke); } } else { size = min(size, sizeof(ke)); static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p) { struct input_keymap_entry ke; if (copy_from_user(&ke, p, size)) if (copy_from_user(&ke, p, sizeof(ke))) return -EFAULT; if (ke.len > sizeof(ke.scancode)) return -EINVAL; } return input_set_keycode(dev, &ke); } Loading Loading @@ -669,6 +666,18 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, return evdev_grab(evdev, client); else return evdev_ungrab(evdev, client); case EVIOCGKEYCODE: return evdev_handle_get_keycode(dev, p); case EVIOCSKEYCODE: return evdev_handle_set_keycode(dev, p); case EVIOCGKEYCODE_V2: return evdev_handle_get_keycode_v2(dev, p); case EVIOCSKEYCODE_V2: return evdev_handle_set_keycode_v2(dev, p); } size = _IOC_SIZE(cmd); Loading Loading @@ -708,12 +717,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, return -EFAULT; return error; case EVIOC_MASK_SIZE(EVIOCGKEYCODE): return evdev_handle_get_keycode(dev, p, size); case EVIOC_MASK_SIZE(EVIOCSKEYCODE): return evdev_handle_set_keycode(dev, p, size); } /* Multi-number variable-length handlers */ Loading
drivers/input/tablet/wacom_wac.c +3 −0 Original line number Diff line number Diff line Loading @@ -1436,6 +1436,8 @@ static struct wacom_features wacom_features_0xD2 = { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xD3 = { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static const struct wacom_features wacom_features_0xD4 = { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 255, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xD8 = { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; static struct wacom_features wacom_features_0xDA = Loading Loading @@ -1510,6 +1512,7 @@ const struct usb_device_id wacom_ids[] = { { USB_DEVICE_WACOM(0xD1) }, { USB_DEVICE_WACOM(0xD2) }, { USB_DEVICE_WACOM(0xD3) }, { USB_DEVICE_WACOM(0xD4) }, { USB_DEVICE_WACOM(0xD8) }, { USB_DEVICE_WACOM(0xDA) }, { USB_DEVICE_WACOM(0xDB) }, Loading
include/linux/input.h +4 −2 Original line number Diff line number Diff line Loading @@ -104,8 +104,10 @@ struct input_keymap_entry { #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ #define EVIOCGKEYCODE _IOR('E', 0x04, struct input_keymap_entry) /* get keycode */ #define EVIOCSKEYCODE _IOW('E', 0x04, struct input_keymap_entry) /* set keycode */ #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ #define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry) #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ #define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry) #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ Loading