[nautilus] search-directory: disconnect leaked signals



commit 6b6428774aa28d87b8c721e66cde4ae06c2a1c8f
Author: Carlos Soriano <csoriano gnome org>
Date:   Mon Jan 18 13:12:00 2016 +0100

    search-directory: disconnect leaked signals
    
    We were not disconnecting them, so they could be called after
    the search-directory is freed, causing a crash.
    
    To be honest, not sure how it survived until now, probably because
    previously (I didn't check) the search engine was freed when stopped.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=759717

 libnautilus-private/nautilus-search-directory.c |   41 +++++++++++++++++-----
 1 files changed, 31 insertions(+), 10 deletions(-)
---
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 5de492f..a920a85 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -746,6 +746,34 @@ clear_base_model (NautilusSearchDirectory *search)
 }
 
 static void
+search_connect_engine (NautilusSearchDirectory *search)
+{
+    g_signal_connect (search->details->engine, "hits-added",
+                      G_CALLBACK (search_engine_hits_added),
+                      search);
+    g_signal_connect (search->details->engine, "error",
+                      G_CALLBACK (search_engine_error),
+                      search);
+    g_signal_connect (search->details->engine, "finished",
+                      G_CALLBACK (search_engine_finished),
+                      search);
+}
+
+static void
+search_disconnect_engine (NautilusSearchDirectory *search)
+{
+    g_signal_handlers_disconnect_by_func (search->details->engine,
+                                          search_engine_hits_added,
+                                          search);
+    g_signal_handlers_disconnect_by_func (search->details->engine,
+                                          search_engine_error,
+                                          search);
+    g_signal_handlers_disconnect_by_func (search->details->engine,
+                                          search_engine_finished,
+                                          search);
+}
+
+static void
 search_dispose (GObject *object)
 {
        NautilusSearchDirectory *search;
@@ -784,6 +812,7 @@ search_dispose (GObject *object)
 
        g_clear_object (&search->details->query);
        stop_search (search);
+        search_disconnect_engine(search);
 
        g_clear_object (&search->details->engine);
        
@@ -810,16 +839,8 @@ nautilus_search_directory_init (NautilusSearchDirectory *search)
 
        search->details->files_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
 
-       search->details->engine = nautilus_search_engine_new ();
-       g_signal_connect (search->details->engine, "hits-added",
-                         G_CALLBACK (search_engine_hits_added),
-                         search);
-       g_signal_connect (search->details->engine, "error",
-                         G_CALLBACK (search_engine_error),
-                         search);
-       g_signal_connect (search->details->engine, "finished",
-                         G_CALLBACK (search_engine_finished),
-                         search);
+        search->details->engine = nautilus_search_engine_new ();
+        search_connect_engine (search);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]