udev: fix segfault when resuming before assigning a seat

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2018-02-16 16:42:00 +10:00
parent 075e998b07
commit 63880d6e1b
2 changed files with 44 additions and 1 deletions

View file

@ -229,7 +229,7 @@ udev_input_enable(struct libinput *libinput)
struct udev *udev = input->udev;
int fd;
if (input->udev_monitor)
if (input->udev_monitor || !input->seat_id)
return 0;
input->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");

View file

@ -394,6 +394,47 @@ START_TEST(udev_suspend_resume)
}
END_TEST
START_TEST(udev_resume_before_seat)
{
struct libinput *li;
struct udev *udev;
int rc;
udev = udev_new();
ck_assert(udev != NULL);
li = libinput_udev_create_context(&simple_interface, NULL, udev);
ck_assert(li != NULL);
rc = libinput_resume(li);
ck_assert_int_eq(rc, 0);
libinput_unref(li);
udev_unref(udev);
}
END_TEST
START_TEST(udev_suspend_resume_before_seat)
{
struct libinput *li;
struct udev *udev;
int rc;
udev = udev_new();
ck_assert(udev != NULL);
li = libinput_udev_create_context(&simple_interface, NULL, udev);
ck_assert(li != NULL);
libinput_suspend(li);
rc = libinput_resume(li);
ck_assert_int_eq(rc, 0);
libinput_unref(li);
udev_unref(udev);
}
END_TEST
START_TEST(udev_device_sysname)
{
struct libinput *li;
@ -619,6 +660,8 @@ litest_setup_tests_udev(void)
litest_add_for_device("udev:suspend", udev_double_suspend, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:suspend", udev_double_resume, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:suspend", udev_suspend_resume, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:suspend", udev_resume_before_seat, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:suspend", udev_suspend_resume_before_seat, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:device events", udev_device_sysname, LITEST_SYNAPTICS_CLICKPAD_X220);
litest_add_for_device("udev:seat", udev_seat_recycle, LITEST_SYNAPTICS_CLICKPAD_X220);