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>
This commit is contained in:
Peter Hutterer 2021-02-12 07:55:21 +10:00
parent db0a2be1a0
commit aed15dd791
4 changed files with 23 additions and 18 deletions

View file

@ -149,6 +149,7 @@ struct path {
};
struct litest_context {
struct litest_user_data *user_data;
struct list paths;
};

View 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,

View 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

View 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