From a34a6015b31f79a7f3b8abc68e3bf05f4a5b9ad0 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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