diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2021-10-15 00:52:54 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2021-10-15 00:52:54 +0300 |
commit | 3bafc5df177159a3fc888f8f0b8888574362bd20 (patch) | |
tree | 512466384ae1ae2f2b94355d9204aa5e6400ef97 /src/interface-gtk/interface.c | |
parent | fdb89d9b0744b98dcc8ceacd53fcdd255fbc0b1e (diff) | |
download | sciteco-3bafc5df177159a3fc888f8f0b8888574362bd20.tar.gz |
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().
Diffstat (limited to 'src/interface-gtk/interface.c')
-rw-r--r-- | src/interface-gtk/interface.c | 6 |
1 files changed, 5 insertions, 1 deletions
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; } |