diff options
| -rw-r--r-- | drivers/input/evdev.c | 113 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.c | 3 | ||||
| -rw-r--r-- | include/linux/input.h | 6 |
3 files changed, 65 insertions, 57 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index e3f7fc6f9565..68f09a868434 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
| @@ -534,76 +534,73 @@ static int handle_eviocgbit(struct input_dev *dev, | |||
| 534 | } | 534 | } |
| 535 | #undef OLD_KEY_MAX | 535 | #undef OLD_KEY_MAX |
| 536 | 536 | ||
| 537 | static int evdev_handle_get_keycode(struct input_dev *dev, | 537 | static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p) |
| 538 | void __user *p, size_t size) | ||
| 539 | { | 538 | { |
| 540 | struct input_keymap_entry ke; | 539 | struct input_keymap_entry ke = { |
| 540 | .len = sizeof(unsigned int), | ||
| 541 | .flags = 0, | ||
| 542 | }; | ||
| 543 | int __user *ip = (int __user *)p; | ||
| 541 | int error; | 544 | int error; |
| 542 | 545 | ||
| 543 | memset(&ke, 0, sizeof(ke)); | 546 | /* legacy case */ |
| 544 | 547 | if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) | |
| 545 | if (size == sizeof(unsigned int[2])) { | 548 | return -EFAULT; |
| 546 | /* legacy case */ | ||
| 547 | int __user *ip = (int __user *)p; | ||
| 548 | 549 | ||
| 549 | if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) | 550 | error = input_get_keycode(dev, &ke); |
| 550 | return -EFAULT; | 551 | if (error) |
| 552 | return error; | ||
| 551 | 553 | ||
| 552 | ke.len = sizeof(unsigned int); | 554 | if (put_user(ke.keycode, ip + 1)) |
| 553 | ke.flags = 0; | 555 | return -EFAULT; |
| 554 | 556 | ||
| 555 | error = input_get_keycode(dev, &ke); | 557 | return 0; |
| 556 | if (error) | 558 | } |
| 557 | return error; | ||
| 558 | 559 | ||
| 559 | if (put_user(ke.keycode, ip + 1)) | 560 | static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p) |
| 560 | return -EFAULT; | 561 | { |
| 562 | struct input_keymap_entry ke; | ||
| 563 | int error; | ||
| 561 | 564 | ||
| 562 | } else { | 565 | if (copy_from_user(&ke, p, sizeof(ke))) |
| 563 | size = min(size, sizeof(ke)); | 566 | return -EFAULT; |
| 564 | 567 | ||
| 565 | if (copy_from_user(&ke, p, size)) | 568 | error = input_get_keycode(dev, &ke); |
| 566 | return -EFAULT; | 569 | if (error) |
| 570 | return error; | ||
| 567 | 571 | ||
| 568 | error = input_get_keycode(dev, &ke); | 572 | if (copy_to_user(p, &ke, sizeof(ke))) |
| 569 | if (error) | 573 | return -EFAULT; |
| 570 | return error; | ||
| 571 | 574 | ||
| 572 | if (copy_to_user(p, &ke, size)) | ||
| 573 | return -EFAULT; | ||
| 574 | } | ||
| 575 | return 0; | 575 | return 0; |
| 576 | } | 576 | } |
| 577 | 577 | ||
| 578 | static int evdev_handle_set_keycode(struct input_dev *dev, | 578 | static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p) |
| 579 | void __user *p, size_t size) | ||
| 580 | { | 579 | { |
| 581 | struct input_keymap_entry ke; | 580 | struct input_keymap_entry ke = { |
| 582 | 581 | .len = sizeof(unsigned int), | |
| 583 | memset(&ke, 0, sizeof(ke)); | 582 | .flags = 0, |
| 583 | }; | ||
| 584 | int __user *ip = (int __user *)p; | ||
| 584 | 585 | ||
| 585 | if (size == sizeof(unsigned int[2])) { | 586 | if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) |
| 586 | /* legacy case */ | 587 | return -EFAULT; |
| 587 | int __user *ip = (int __user *)p; | ||
| 588 | 588 | ||
| 589 | if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) | 589 | if (get_user(ke.keycode, ip + 1)) |
| 590 | return -EFAULT; | 590 | return -EFAULT; |
| 591 | 591 | ||
| 592 | if (get_user(ke.keycode, ip + 1)) | 592 | return input_set_keycode(dev, &ke); |
| 593 | return -EFAULT; | 593 | } |
| 594 | 594 | ||
| 595 | ke.len = sizeof(unsigned int); | 595 | static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p) |
| 596 | ke.flags = 0; | 596 | { |
| 597 | struct input_keymap_entry ke; | ||
| 597 | 598 | ||
| 598 | } else { | 599 | if (copy_from_user(&ke, p, sizeof(ke))) |
| 599 | size = min(size, sizeof(ke)); | 600 | return -EFAULT; |
| 600 | 601 | ||
| 601 | if (copy_from_user(&ke, p, size)) | 602 | if (ke.len > sizeof(ke.scancode)) |
| 602 | return -EFAULT; | 603 | return -EINVAL; |
| 603 | |||
| 604 | if (ke.len > sizeof(ke.scancode)) | ||
| 605 | return -EINVAL; | ||
| 606 | } | ||
| 607 | 604 | ||
| 608 | return input_set_keycode(dev, &ke); | 605 | return input_set_keycode(dev, &ke); |
| 609 | } | 606 | } |
| @@ -669,6 +666,18 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
| 669 | return evdev_grab(evdev, client); | 666 | return evdev_grab(evdev, client); |
| 670 | else | 667 | else |
| 671 | return evdev_ungrab(evdev, client); | 668 | return evdev_ungrab(evdev, client); |
| 669 | |||
| 670 | case EVIOCGKEYCODE: | ||
| 671 | return evdev_handle_get_keycode(dev, p); | ||
| 672 | |||
| 673 | case EVIOCSKEYCODE: | ||
| 674 | return evdev_handle_set_keycode(dev, p); | ||
| 675 | |||
| 676 | case EVIOCGKEYCODE_V2: | ||
| 677 | return evdev_handle_get_keycode_v2(dev, p); | ||
| 678 | |||
| 679 | case EVIOCSKEYCODE_V2: | ||
| 680 | return evdev_handle_set_keycode_v2(dev, p); | ||
| 672 | } | 681 | } |
| 673 | 682 | ||
| 674 | size = _IOC_SIZE(cmd); | 683 | size = _IOC_SIZE(cmd); |
| @@ -708,12 +717,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
| 708 | return -EFAULT; | 717 | return -EFAULT; |
| 709 | 718 | ||
| 710 | return error; | 719 | return error; |
| 711 | |||
| 712 | case EVIOC_MASK_SIZE(EVIOCGKEYCODE): | ||
| 713 | return evdev_handle_get_keycode(dev, p, size); | ||
| 714 | |||
| 715 | case EVIOC_MASK_SIZE(EVIOCSKEYCODE): | ||
| 716 | return evdev_handle_set_keycode(dev, p, size); | ||
| 717 | } | 720 | } |
| 718 | 721 | ||
| 719 | /* Multi-number variable-length handlers */ | 722 | /* Multi-number variable-length handlers */ |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 4852b440960a..435b0af401e4 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1436,6 +1436,8 @@ static struct wacom_features wacom_features_0xD2 = | |||
| 1436 | { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; | 1436 | { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, 63, BAMBOO_PT }; |
| 1437 | static struct wacom_features wacom_features_0xD3 = | 1437 | static struct wacom_features wacom_features_0xD3 = |
| 1438 | { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; | 1438 | { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; |
| 1439 | static const struct wacom_features wacom_features_0xD4 = | ||
| 1440 | { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 255, 63, BAMBOO_PT }; | ||
| 1439 | static struct wacom_features wacom_features_0xD8 = | 1441 | static struct wacom_features wacom_features_0xD8 = |
| 1440 | { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; | 1442 | { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13530, 1023, 63, BAMBOO_PT }; |
| 1441 | static struct wacom_features wacom_features_0xDA = | 1443 | static struct wacom_features wacom_features_0xDA = |
| @@ -1510,6 +1512,7 @@ const struct usb_device_id wacom_ids[] = { | |||
| 1510 | { USB_DEVICE_WACOM(0xD1) }, | 1512 | { USB_DEVICE_WACOM(0xD1) }, |
| 1511 | { USB_DEVICE_WACOM(0xD2) }, | 1513 | { USB_DEVICE_WACOM(0xD2) }, |
| 1512 | { USB_DEVICE_WACOM(0xD3) }, | 1514 | { USB_DEVICE_WACOM(0xD3) }, |
| 1515 | { USB_DEVICE_WACOM(0xD4) }, | ||
| 1513 | { USB_DEVICE_WACOM(0xD8) }, | 1516 | { USB_DEVICE_WACOM(0xD8) }, |
| 1514 | { USB_DEVICE_WACOM(0xDA) }, | 1517 | { USB_DEVICE_WACOM(0xDA) }, |
| 1515 | { USB_DEVICE_WACOM(0xDB) }, | 1518 | { USB_DEVICE_WACOM(0xDB) }, |
diff --git a/include/linux/input.h b/include/linux/input.h index a8af21d42bc1..9777668883be 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -104,8 +104,10 @@ struct input_keymap_entry { | |||
| 104 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ | 104 | #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ |
| 105 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ | 105 | #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ |
| 106 | 106 | ||
| 107 | #define EVIOCGKEYCODE _IOR('E', 0x04, struct input_keymap_entry) /* get keycode */ | 107 | #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ |
| 108 | #define EVIOCSKEYCODE _IOW('E', 0x04, struct input_keymap_entry) /* set keycode */ | 108 | #define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry) |
| 109 | #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ | ||
| 110 | #define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry) | ||
| 109 | 111 | ||
| 110 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ | 112 | #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ |
| 111 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ | 113 | #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ |
