summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2021-02-12 07:55:21 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2021-02-12 11:04:57 +1000
commitaed15dd791648fcb8f6102f6f86917ca18b5521b (patch)
treeb4b86fe4dab6efc8aa8994249296cdd943e48287
parentdb0a2be1a023294000791fd0cb3d72f951045f02 (diff)
downloadlibinput-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.h1
-rw-r--r--test/litest.h10
-rw-r--r--test/test-misc.c20
-rw-r--r--test/test-tablet.c10
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