From 3bafc5df177159a3fc888f8f0b8888574362bd20 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Fri, 15 Oct 2021 00:52:54 +0300 Subject: Gtk: prevent hard to predict teco_interface_key_pressed_cb() recursions * Due to introducing another gtk_main_iteration_do(), there could indeed be unforseen recursions of teco_interface_key_pressed_cb() that resulted in additional teco_interface_handle_key_press() calls. * This did not cause crashes, but we better prevent recursions altogether. While emptying the key event queue, we only allow other events to be queued by all possibly recursive invocations of teco_interface_key_pressed_cb(). --- src/interface-gtk/interface.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/interface-gtk/interface.c') diff --git a/src/interface-gtk/interface.c b/src/interface-gtk/interface.c index d8cc7cd..a6369f1 100644 --- a/src/interface-gtk/interface.c +++ b/src/interface-gtk/interface.c @@ -1116,6 +1116,7 @@ teco_interface_cmdline_size_allocate_cb(GtkWidget *widget, static gboolean teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { + static gboolean recursed = FALSE; g_autoptr(GError) error = NULL; #ifdef DEBUG @@ -1124,7 +1125,7 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us event->state & GDK_SHIFT_MASK, event->state & GDK_CONTROL_MASK); #endif - if (teco_cmdline.pc < teco_cmdline.effective_len) { + if (recursed) { /* * We're already executing, so this event is processed * from gtk_main_iteration_do(). @@ -1151,6 +1152,8 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us return TRUE; } + recursed = TRUE; + g_queue_push_tail(teco_interface.event_queue, gdk_event_copy((GdkEvent *)event)); GdkWindow *top_window = gdk_window_get_toplevel(gtk_widget_get_window(teco_interface.window)); @@ -1189,6 +1192,7 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us gtk_main_iteration_do(FALSE); } while (!g_queue_is_empty(teco_interface.event_queue)); + recursed = FALSE; return TRUE; } -- cgit v1.2.3