libevdev: enforce state resync if SYN_DROPPED happens
BUG=chrome-os-partner:20471
TEST=none; don't know how to trigger it yet
Change-Id: Icfdafb64ceb7e7ac27ad80b16570a9f3c4d503e2
Reviewed-on: https://gerrit.chromium.org/gerrit/60209
Reviewed-by: Andrew de los Reyes <adlr@chromium.org>
Commit-Queue: Chung-yih Wang <cywang@chromium.org>
Tested-by: Chung-yih Wang <cywang@chromium.org>
diff --git a/src/libevdev.c b/src/libevdev.c
index a57ff94..2e0ecc2 100644
--- a/src/libevdev.c
+++ b/src/libevdev.c
@@ -61,7 +61,7 @@
do {
len = read(evdev->fd, &ev, sizeof(ev));
if (len <= 0)
- return errno;
+ break;
/* Read as many whole struct input_event objects as we can into the
circular buffer */
@@ -75,7 +75,7 @@
/* kernel always delivers complete events, so len must be sizeof *ev */
if (len % sizeof(*ev))
- return errno;
+ break;
/* Process events ... */
for (i = 0; i < len / sizeof(ev[0]); i++) {
@@ -86,7 +86,7 @@
continue;
} else if (timercmp(&ev[i].time, &evdev->after_sync_time, >)) {
/* Event_Process returns TRUE if SYN_DROPPED detected */
- sync_evdev_state = Event_Process(evdev, &ev[i]);
+ sync_evdev_state |= Event_Process(evdev, &ev[i]);
} else {
/* If the event occurred during sync, then sync again */
sync_evdev_state = true;