summaryrefslogtreecommitdiff
path: root/daemon/gvfsbackendnetwork.c
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2016-01-27 09:07:02 +0100
committerOndrej Holy <oholy@redhat.com>2016-01-29 13:16:44 +0100
commit45c4dcc3bcd40df923ef1e6152eb3502f0030960 (patch)
tree8b788dd263f81d03e03a8196970728607524f58e /daemon/gvfsbackendnetwork.c
parent7a210850cbd931859e28fafd3f3be8db8f76b3f6 (diff)
downloadgvfs-45c4dcc3bcd40df923ef1e6152eb3502f0030960.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
Diffstat (limited to 'daemon/gvfsbackendnetwork.c')
-rw-r--r--daemon/gvfsbackendnetwork.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/daemon/gvfsbackendnetwork.c b/daemon/gvfsbackendnetwork.c
index 5e55b4bc..45307052 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;
@@ -960,6 +960,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);