diff options
author | Carlos Soriano <csoriano@gnome.org> | 2016-01-18 13:12:00 +0100 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2016-01-18 13:12:00 +0100 |
commit | 98df310d179c5172756fc82fda8c94332d741403 (patch) | |
tree | 4b3df686741ba94b29899b06fbbd05532d1fe8e2 | |
parent | 21265296a96d01f4a89b0cdac99a5c2c63596ccd (diff) | |
download | nautilus-98df310d179c5172756fc82fda8c94332d741403.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.
-rw-r--r-- | 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 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 |