summaryrefslogtreecommitdiff
path: root/lib/igt_kms.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-02-15 12:47:09 +0100
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-02-15 14:22:48 +0100
commit64c216764e059f51b653b3bbfaf4776d1903f141 (patch)
tree5cec2351001a86b51b9f7ae17db51a5e14f51827 /lib/igt_kms.c
parent8252cced6b0eaf77375f106989e36d3404ac5c5f (diff)
lib/igt_kms: Fix igt_display_drop_events() to work as intended
Short reads don't work, you either read the whole event or nothing at all, so follow the recommendations in the documentation and allocate a buffer of 4096 bytes for the event, if we capture multiple events read them all. Cc: Jari Tahvanainen <jari.tahvanainen@intel.com> Reported-by: Jari Tahvanainen <jari.tahvanainen@intel.com> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104538 [mlankhorst: Assign ev once in the loop, instead of 2 places. (ickle)] Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r--lib/igt_kms.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index ecc7a799..cc4a1f72 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -3152,14 +3152,20 @@ int igt_display_drop_events(igt_display_t *display)
};
while (poll(&pfd, 1, 0) > 0) {
- struct drm_event ev;
- char buf[128];
-
- read(display->drm_fd, &ev, sizeof(ev));
- igt_info("Dropping event type %u length %u\n", ev.type, ev.length);
- igt_assert(ev.length <= sizeof(buf));
- read(display->drm_fd, buf, ev.length);
- ret++;
+ struct drm_event *ev;
+ char buf[4096];
+ ssize_t retval;
+
+ retval = read(display->drm_fd, &buf, sizeof(buf));
+ igt_assert_lt(0, retval);
+
+ for (int i = 0; i < retval; i += ev->length) {
+ ev = (struct drm_event *)&buf[i];
+
+ igt_info("Dropping event type %u length %u\n", ev->type, ev->length);
+ igt_assert(ev->length + i <= sizeof(buf));
+ ret++;
+ }
}
return ret;