diff --git a/include/action.h b/include/action.h index 31ecfb6e..7692e383 100644 --- a/include/action.h +++ b/include/action.h @@ -50,6 +50,7 @@ bool actions_contain_toggle_keybinds(struct wl_list *action_list); void actions_run(struct view *activator, struct server *server, struct wl_list *actions, struct cursor_context *ctx); +void action_prompts_destroy(void); bool action_check_prompt_result(pid_t pid, int exit_code); void action_free(struct action *action); diff --git a/src/action.c b/src/action.c index 62ab2b2d..9a5623ff 100644 --- a/src/action.c +++ b/src/action.c @@ -867,6 +867,15 @@ cleanup: buf_reset(&command); } +void +action_prompts_destroy(void) +{ + struct action_prompt *prompt, *tmp; + wl_list_for_each_safe(prompt, tmp, &prompts, link) { + action_prompt_destroy(prompt); + } +} + bool action_check_prompt_result(pid_t pid, int exit_code) { diff --git a/src/server.c b/src/server.c index 56f091b9..c39649b8 100644 --- a/src/server.c +++ b/src/server.c @@ -78,6 +78,9 @@ static void reload_config_and_theme(struct server *server) { + /* Avoid UAF when dialog client is used during reconfigure */ + action_prompts_destroy(); + scaled_buffer_invalidate_sharing(); rcxml_finish(); rcxml_read(rc.config_file);