diff options
author | Ondrej Holy <oholy@redhat.com> | 2016-01-27 09:07:02 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2016-02-18 13:50:17 +0100 |
commit | fdfa790f7435332fa7942a209d436e4b854909c1 (patch) | |
tree | c1133be5bfc6c3d470b8b9fa5fea88b0cdadb602 | |
parent | 88d13b4b6017efdd2cdb1ddda2fb7b4e88c41b96 (diff) | |
download | gvfs-fdfa790f7435332fa7942a209d436e4b854909c1.tar.gz |
network: Fix crashes when mount failed
Mount operation might fail if you run multiple mount operations concurrently.
Backend memory is released consequently. Unfortunatelly some idle sources
and signal handlers are not removed, which might cause segmentation faults.
This patch fixes this and also some other memory leaks.
https://bugzilla.gnome.org/show_bug.cgi?id=712235
-rw-r--r-- | daemon/gvfsbackendnetwork.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/daemon/gvfsbackendnetwork.c b/daemon/gvfsbackendnetwork.c index bdb9cb9f..4403277d 100644 --- a/daemon/gvfsbackendnetwork.c +++ b/daemon/gvfsbackendnetwork.c @@ -299,7 +299,7 @@ update_from_files (GVfsBackendNetwork *backend, } } - g_list_foreach (old_files, (GFunc)network_file_free, NULL); + g_list_free_full (old_files, (GDestroyNotify)network_file_free); } static void @@ -652,7 +652,7 @@ smb_settings_change_event_cb (GSettings *settings, { g_signal_handlers_disconnect_by_func (backend->smb_monitor, notify_smb_files_changed, - backend->smb_monitor); + backend); g_file_monitor_cancel (backend->smb_monitor); g_object_unref (backend->smb_monitor); backend->smb_monitor = NULL; @@ -948,6 +948,28 @@ g_vfs_backend_network_finalize (GObject *object) g_object_unref (backend->smb_settings); if (backend->dnssd_settings) g_object_unref (backend->dnssd_settings); + if (backend->dnssd_monitor) + { + g_signal_handlers_disconnect_by_func (backend->dnssd_monitor, notify_dnssd_local_changed, backend); + g_clear_object (&backend->dnssd_monitor); + } + if (backend->smb_monitor) + { + g_signal_handlers_disconnect_by_func (backend->smb_monitor, notify_smb_files_changed, backend); + g_clear_object (&backend->smb_monitor); + } + if (backend->idle_tag) + { + g_source_remove (backend->idle_tag); + backend->idle_tag = 0; + } + if (backend->files) + { + g_list_free_full (backend->files, (GDestroyNotify)network_file_free); + backend->files = NULL; + } + g_free (backend->current_workgroup); + g_free (backend->extra_domains); if (G_OBJECT_CLASS (g_vfs_backend_network_parent_class)->finalize) (*G_OBJECT_CLASS (g_vfs_backend_network_parent_class)->finalize) (object); |