[gvfs/gnome-3-18] network: Fix crashes when mount failed



commit 428adf56bbca298c0a92091de6dc10369d020a83
Author: Ondrej Holy <oholy redhat com>
Date:   Wed Jan 27 09:07:02 2016 +0100

    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

 daemon/gvfsbackendnetwork.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)
---
diff --git a/daemon/gvfsbackendnetwork.c b/daemon/gvfsbackendnetwork.c
index 5e55b4b..4530705 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]