summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2016-01-27 09:07:02 +0100
committerOndrej Holy <oholy@redhat.com>2016-02-18 13:50:17 +0100
commitfdfa790f7435332fa7942a209d436e4b854909c1 (patch)
treec1133be5bfc6c3d470b8b9fa5fea88b0cdadb602
parent88d13b4b6017efdd2cdb1ddda2fb7b4e88c41b96 (diff)
downloadgvfs-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.c26
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);