diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 95f90699d2b1..7cd3adbb33b2 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -588,7 +588,7 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, if (input_event_to_user(buffer + read, &event)) return -EFAULT; - read += input_event_size(); + read += sizeof(struct input_event_64bit); } if (read) diff --git a/drivers/input/input-compat.c b/drivers/input/input-compat.c index 2ccd3eedbd67..477be38c7c87 100644 --- a/drivers/input/input-compat.c +++ b/drivers/input/input-compat.c @@ -99,16 +99,30 @@ int input_ff_effect_from_user(const char __user *buffer, size_t size, int input_event_from_user(const char __user *buffer, struct input_event *event) { - if (copy_from_user(event, buffer, sizeof(struct input_event))) + struct input_event_64bit event64_bit; + if (copy_from_user(&event64_bit, buffer, sizeof(struct input_event_64bit))) return -EFAULT; + event->input_event_sec = event64_bit.sec; + event->input_event_usec = event64_bit.usec; + event->type = event64_bit.type; + event->code = event64_bit.code; + event->value = event64_bit.value; + return 0; } int input_event_to_user(char __user *buffer, const struct input_event *event) { - if (copy_to_user(buffer, event, sizeof(struct input_event))) + struct input_event_64bit event64_bit; + event64_bit.sec = event->input_event_sec; + event64_bit.usec = event->input_event_usec; + event64_bit.type = event->type; + event64_bit.code = event->code; + event64_bit.value = event->value; + + if (copy_to_user(buffer, &event64_bit, sizeof(struct input_event_64bit))) return -EFAULT; return 0; diff --git a/drivers/input/input-compat.h b/drivers/input/input-compat.h index 3b7bb12b023b..c1b14b3babae 100644 --- a/drivers/input/input-compat.h +++ b/drivers/input/input-compat.h @@ -12,6 +12,15 @@ #include #include + +struct input_event_64bit { + unsigned long long sec; + unsigned long long usec; + __u16 type; + __u16 code; + __s32 value; +}; + #ifdef CONFIG_COMPAT struct input_event_compat {