test: wrap the litest user data into a struct
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 11 Feb 2021 21:55:21 +0000 (07:55 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 12 Feb 2021 01:04:57 +0000 (11:04 +1000)
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>
test/litest-int.h
test/litest.h
test/test-misc.c
test/test-tablet.c

index 06717d1c2686d7897df466c6eac7e1d97ff0badc..6bcb6eb8844f9db7c14b3f5cb781a9194d6f7a45 100644 (file)
@@ -149,6 +149,7 @@ struct path {
 };
 
 struct litest_context {
+       struct litest_user_data *user_data;
        struct list paths;
 };
 
index a8c4a575a8b700a59b8a32366944663bf2ac6e0e..5c618c0b3372c896ef8a95e5ccaf8ff950944832 100644 (file)
@@ -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,
index 850286885e9b0b97ee0cd5b292689fb2b244a427..4a946d4b2ee402ad55f3ccc8cf009d50b49dc291 100644 (file)
@@ -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
 
index 462b5fe2565692dc3d3ee3c97847793c90ef1819..75019ec5ab5d7a5caf8cf024415d4469ccf8e4ea 100644 (file)
@@ -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