diff options
Diffstat (limited to 'gnome-base/gvfs/files/gvfs-1.24.2-remote-proxy.patch')
-rw-r--r-- | gnome-base/gvfs/files/gvfs-1.24.2-remote-proxy.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/gnome-base/gvfs/files/gvfs-1.24.2-remote-proxy.patch b/gnome-base/gvfs/files/gvfs-1.24.2-remote-proxy.patch new file mode 100644 index 0000000000..bc47a1a3db --- /dev/null +++ b/gnome-base/gvfs/files/gvfs-1.24.2-remote-proxy.patch @@ -0,0 +1,74 @@ +From d19a4bc2475705f8252f8952c446b57b31661453 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray <debarshir@gnome.org> +Date: Fri, 16 Oct 2015 13:35:34 +0200 +Subject: proxy volume monitor: Properly handle failure to create a remote + proxy + +We should finish constructing the innards of the object and not leave +it in an inconsistent state when we hit an error. The other option +would be to litter the rest of the code with NULL checks, but that +would be ugly and prone to errors. + +We should also ensure that the reference counting stays consistent with +the non-error paths. + +https://bugzilla.gnome.org/show_bug.cgi?id=755805 +--- + monitor/proxy/gproxyvolumemonitor.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/monitor/proxy/gproxyvolumemonitor.c b/monitor/proxy/gproxyvolumemonitor.c +index 17474a8..a7466f0 100644 +--- a/monitor/proxy/gproxyvolumemonitor.c ++++ b/monitor/proxy/gproxyvolumemonitor.c +@@ -972,10 +972,7 @@ g_proxy_volume_monitor_constructor (GType type, + klass = G_PROXY_VOLUME_MONITOR_CLASS (g_type_class_peek (type)); + object = g_hash_table_lookup (the_volume_monitors, (gpointer) type); + if (object != NULL) +- { +- g_object_ref (object); +- goto out; +- } ++ goto out; + + dbus_name = klass->dbus_name; + +@@ -988,6 +985,10 @@ g_proxy_volume_monitor_constructor (GType type, + + monitor = G_PROXY_VOLUME_MONITOR (object); + ++ monitor->drives = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); ++ monitor->volumes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); ++ monitor->mounts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); ++ + error = NULL; + monitor->proxy = gvfs_remote_volume_monitor_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, +@@ -1022,10 +1023,6 @@ g_proxy_volume_monitor_constructor (GType type, + g_signal_connect (monitor->proxy, "volume-changed", G_CALLBACK (volume_changed), monitor); + g_signal_connect (monitor->proxy, "volume-removed", G_CALLBACK (volume_removed), monitor); + +- monitor->drives = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); +- monitor->volumes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); +- monitor->mounts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); +- + /* listen to when the owner of the service appears/disappears */ + g_signal_connect (monitor->proxy, "notify::g-name-owner", G_CALLBACK (name_owner_changed), monitor); + /* initially seed drives/volumes/mounts if we have an owner */ +@@ -1038,12 +1035,12 @@ g_proxy_volume_monitor_constructor (GType type, + + g_hash_table_insert (the_volume_monitors, (gpointer) type, object); + ++ out: + /* Take an extra reference to make the instance live forever - see also + * the dispose() and finalize() vfuncs + */ + g_object_ref (object); + +- out: + G_UNLOCK (proxy_vm); + return object; + } +-- +cgit v0.11.2 + |