diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2021-02-12 07:55:21 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2021-02-12 11:04:57 +1000 |
commit | aed15dd791648fcb8f6102f6f86917ca18b5521b (patch) | |
tree | b4b86fe4dab6efc8aa8994249296cdd943e48287 | |
parent | db0a2be1a023294000791fd0cb3d72f951045f02 (diff) | |
download | libinput-aed15dd791648fcb8f6102f6f86917ca18b5521b.tar.gz |
test: wrap the litest user data into a struct
litest itself requires the libinput user_data to be set to its own context
struct (see close_restricted). A test that needs its own user_data must not
override this struct - if the context is accessed during libinput_dispatch()
we'll get memory corruption.
See #574
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | test/litest-int.h | 1 | ||||
-rw-r--r-- | test/litest.h | 10 | ||||
-rw-r--r-- | test/test-misc.c | 20 | ||||
-rw-r--r-- | test/test-tablet.c | 10 |
4 files changed, 23 insertions, 18 deletions
diff --git a/test/litest-int.h b/test/litest-int.h index 06717d1c..6bcb6eb8 100644 --- a/test/litest-int.h +++ b/test/litest-int.h @@ -149,6 +149,7 @@ struct path { }; struct litest_context { + struct litest_user_data *user_data; struct list paths; }; diff --git a/test/litest.h b/test/litest.h index a8c4a575..5c618c0b 100644 --- a/test/litest.h +++ b/test/litest.h @@ -78,6 +78,16 @@ struct test_collection { }; \ static void (name##_setup)(void) + +/** + * litest itself needs the user_data to store some test-suite-specific + * information. Tests must not override this pointer, any data they need + * they can hang off the private pointer in this struct. + */ +struct litest_user_data { + void *private; +}; + void litest_fail_condition(const char *file, int line, diff --git a/test/test-misc.c b/test/test-misc.c index 85028688..4a946d4b 100644 --- a/test/test-misc.c +++ b/test/test-misc.c @@ -657,7 +657,8 @@ static void timer_offset_warning(struct libinput *libinput, const char *format, va_list args) { - int *warning_triggered = (int*)libinput_get_user_data(libinput); + struct litest_user_data *user_data = libinput_get_user_data(libinput); + int *warning_triggered = user_data->private; if (priority == LIBINPUT_LOG_PRIORITY_ERROR && strstr(format, "scheduled expiry is in the past")) @@ -669,7 +670,7 @@ START_TEST(timer_offset_bug_warning) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; int warning_triggered = 0; - void *old_user_data; + struct litest_user_data *user_data = libinput_get_user_data(li); litest_enable_tap(dev->libinput_device); litest_drain_events(li); @@ -679,16 +680,13 @@ START_TEST(timer_offset_bug_warning) litest_timeout_tap(); - old_user_data = libinput_get_user_data(li); - libinput_set_user_data(li, &warning_triggered); + user_data->private = &warning_triggered; libinput_log_set_handler(li, timer_offset_warning); libinput_dispatch(li); /* triggered for touch down and touch up */ ck_assert_int_eq(warning_triggered, 2); litest_restore_log_handler(li); - - libinput_set_user_data(li, old_user_data); } END_TEST @@ -697,25 +695,24 @@ static void timer_delay_warning(struct libinput *libinput, const char *format, va_list args) { - int *warning_triggered = (int*)libinput_get_user_data(libinput); + struct litest_user_data *user_data = libinput_get_user_data(libinput); + int *warning_triggered = user_data->private; if (priority == LIBINPUT_LOG_PRIORITY_ERROR && strstr(format, "event processing lagging behind by")) (*warning_triggered)++; } - START_TEST(timer_delay_bug_warning) { struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; int warning_triggered = 0; - void *old_user_data; + struct litest_user_data *user_data = libinput_get_user_data(li); - old_user_data = libinput_get_user_data(li); litest_drain_events(li); - libinput_set_user_data(li, &warning_triggered); + user_data->private = &warning_triggered; libinput_log_set_handler(li, timer_delay_warning); for (int i = 0; i < 10; i++) { @@ -728,7 +725,6 @@ START_TEST(timer_delay_bug_warning) ck_assert_int_ge(warning_triggered, 1); litest_restore_log_handler(li); - libinput_set_user_data(li, old_user_data); } END_TEST diff --git a/test/test-tablet.c b/test/test-tablet.c index 462b5fe2..75019ec5 100644 --- a/test/test-tablet.c +++ b/test/test-tablet.c @@ -4101,7 +4101,8 @@ pressure_threshold_warning(struct libinput *libinput, const char *format, va_list args) { - int *warning_triggered = (int*)libinput_get_user_data(libinput); + struct litest_user_data *user_data = libinput_get_user_data(libinput); + int *warning_triggered = user_data->private; if (priority == LIBINPUT_LOG_PRIORITY_ERROR && strstr(format, "pressure offset greater")) @@ -4121,12 +4122,11 @@ START_TEST(tablet_pressure_offset_exceed_threshold) }; double pressure; int warning_triggered = 0; - void *old_user_data; + struct litest_user_data *user_data = libinput_get_user_data(li); litest_drain_events(li); - old_user_data = libinput_get_user_data(li); - libinput_set_user_data(li, &warning_triggered); + user_data->private = &warning_triggered; libinput_log_set_handler(li, pressure_threshold_warning); litest_tablet_proximity_in(dev, 5, 100, axes); @@ -4140,8 +4140,6 @@ START_TEST(tablet_pressure_offset_exceed_threshold) ck_assert_int_eq(warning_triggered, 1); litest_restore_log_handler(li); - - libinput_set_user_data(li, old_user_data); } END_TEST |