summaryrefslogtreecommitdiff
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:22:26 +0100
commit428adf56bbca298c0a92091de6dc10369d020a83 (patch)
tree2288f5cc92fa38e76980b2bb76b1fc5f3b22777c
parentb7a511b4c80ccf996985a8c009ecc07b7fa97f03 (diff)
downloadgvfs-428adf56bbca298c0a92091de6dc10369d020a83.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 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);