summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2016-01-18 13:12:00 +0100
committerCarlos Soriano <csoriano@gnome.org>2016-01-18 13:19:31 +0100
commit6b6428774aa28d87b8c721e66cde4ae06c2a1c8f (patch)
tree798ff3cfe66fc1386e501a40db98ce543437a4cd
parentf52bf0f7f4427cfaf850903b1257cc818635be34 (diff)
downloadnautilus-6b6428774aa28d87b8c721e66cde4ae06c2a1c8f.tar.gz
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
-rw-r--r--libnautilus-private/nautilus-search-directory.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 5de492fad..a920a8589 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