From a34a6015b31f79a7f3b8abc68e3bf05f4a5b9ad0 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 21 Dec 2018 11:00:47 +0100 Subject: Disconnected redraw signal on dispose to avoid an UAF. --- src/gtkext/gtkblockdisplay.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/gtkext/gtkblockdisplay.c b/src/gtkext/gtkblockdisplay.c index 92c445b..c8d12ea 100644 --- a/src/gtkext/gtkblockdisplay.c +++ b/src/gtkext/gtkblockdisplay.c @@ -171,6 +171,21 @@ static void gtk_block_display_init(GtkBlockDisplay *display) static void gtk_block_display_dispose(GtkBlockDisplay *display) { + GBufferView *view; /* Vue sur du texte */ + + /** + * Même si à priori, la vue est propre au composant, on coupe le signal + * afin qu'une émission d'une instance de vue toujours active ne renvoie pas + * en paramètre un composant d'affichage libéré. + */ + + view = GTK_BUFFER_DISPLAY(display)->view; + + if (view != NULL) + g_signal_handlers_disconnect_by_func(G_OBJECT(view), + G_CALLBACK(gtk_block_display_need_redraw), + display); + G_OBJECT_CLASS(gtk_block_display_parent_class)->dispose(G_OBJECT(display)); } @@ -209,7 +224,7 @@ static void gtk_block_display_finalize(GtkBlockDisplay *display) GtkWidget *gtk_block_display_new(GBufferView *view) { - GtkBlockDisplay *result; /* Composant à retourner */ + GtkBlockDisplay *result; /* Composant à retourner */ result = g_object_new(GTK_TYPE_BLOCK_DISPLAY, NULL); -- cgit v0.11.2-87-g4458