fix: guard wl_list_remove in input destroy handlers against double-remove during wl_display_close

This commit is contained in:
lkn 2026-06-06 11:11:30 +02:00
parent 1c6c9d6e66
commit 6a9b509d77
1 changed files with 12 additions and 18 deletions

View File

@ -17,16 +17,16 @@ void handle_pointer_button(struct wl_listener *listener, void *data);
void handle_pointer_frame(struct wl_listener *listener, void *data);
void handle_pointer_axis(struct wl_listener *listener, void *data);
#define INPUT_LISTENER_REMOVE(l) \
do { if ((l).link.next) { wl_list_remove(&(l).link); wl_list_init(&(l).link); } } while (0)
static void
handle_keyboard_destroy(struct wl_listener *listener, void *data)
{
(void)listener; (void)data;
wl_list_remove(&wl_state.real_keyboard_key_listener.link);
wl_list_remove(&wl_state.real_keyboard_modifiers_listener.link);
wl_list_remove(&wl_state.real_keyboard_destroy_listener.link);
wl_list_init(&wl_state.real_keyboard_key_listener.link);
wl_list_init(&wl_state.real_keyboard_modifiers_listener.link);
wl_list_init(&wl_state.real_keyboard_destroy_listener.link);
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_key_listener);
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_modifiers_listener);
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_destroy_listener);
wl_state.real_keyboard_dev = NULL;
wl_state.keyboard_dev = NULL;
}
@ -35,18 +35,12 @@ static void
handle_pointer_destroy(struct wl_listener *listener, void *data)
{
(void)listener; (void)data;
wl_list_remove(&wl_state.pointer_motion_listener.link);
wl_list_remove(&wl_state.real_pointer_motion_abs_listener.link);
wl_list_remove(&wl_state.real_pointer_button_listener.link);
wl_list_remove(&wl_state.real_pointer_frame_listener.link);
wl_list_remove(&wl_state.real_pointer_axis_listener.link);
wl_list_remove(&wl_state.real_pointer_destroy_listener.link);
wl_list_init(&wl_state.pointer_motion_listener.link);
wl_list_init(&wl_state.real_pointer_motion_abs_listener.link);
wl_list_init(&wl_state.real_pointer_button_listener.link);
wl_list_init(&wl_state.real_pointer_frame_listener.link);
wl_list_init(&wl_state.real_pointer_axis_listener.link);
wl_list_init(&wl_state.real_pointer_destroy_listener.link);
INPUT_LISTENER_REMOVE(wl_state.pointer_motion_listener);
INPUT_LISTENER_REMOVE(wl_state.real_pointer_motion_abs_listener);
INPUT_LISTENER_REMOVE(wl_state.real_pointer_button_listener);
INPUT_LISTENER_REMOVE(wl_state.real_pointer_frame_listener);
INPUT_LISTENER_REMOVE(wl_state.real_pointer_axis_listener);
INPUT_LISTENER_REMOVE(wl_state.real_pointer_destroy_listener);
wl_state.real_pointer_dev = NULL;
wl_state.pointer_dev = NULL;
}