From 6a9b509d77d8cd438c696b46608636c3eb1d88d2 Mon Sep 17 00:00:00 2001 From: lkn Date: Sat, 6 Jun 2026 11:11:30 +0200 Subject: [PATCH] fix: guard wl_list_remove in input destroy handlers against double-remove during wl_display_close --- src/backend/wayland/wl_input_fwd.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/backend/wayland/wl_input_fwd.c b/src/backend/wayland/wl_input_fwd.c index 61de948..3836cb2 100644 --- a/src/backend/wayland/wl_input_fwd.c +++ b/src/backend/wayland/wl_input_fwd.c @@ -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; }