|
|
fd368b |
From aeecd81dd13e4d8ef609149f82770ad06a8fccdb Mon Sep 17 00:00:00 2001
|
|
|
fd368b |
From: Beniamino Galvani <bgalvani@redhat.com>
|
|
|
fd368b |
Date: Sat, 30 Sep 2017 11:26:29 +0200
|
|
|
fd368b |
Subject: [PATCH] gio: fix race condition in GDBusObjectManagerClient
|
|
|
fd368b |
|
|
|
fd368b |
priv->map_object_path_to_object_proxy must be protected to avoid
|
|
|
fd368b |
concurrent access by multiple threads. Move the hash table insertion
|
|
|
fd368b |
into the critical section.
|
|
|
fd368b |
|
|
|
fd368b |
https://bugzilla.gnome.org/show_bug.cgi?id=788368
|
|
|
fd368b |
---
|
|
|
fd368b |
gio/gdbusobjectmanagerclient.c | 15 +++++++++------
|
|
|
fd368b |
1 file changed, 9 insertions(+), 6 deletions(-)
|
|
|
fd368b |
|
|
|
fd368b |
diff --git a/gio/gdbusobjectmanagerclient.c b/gio/gdbusobjectmanagerclient.c
|
|
|
fd368b |
index 1c00797cd165..08c94d5068ef 100644
|
|
|
fd368b |
--- a/gio/gdbusobjectmanagerclient.c
|
|
|
fd368b |
+++ b/gio/gdbusobjectmanagerclient.c
|
|
|
fd368b |
@@ -1542,6 +1542,13 @@ add_interfaces (GDBusObjectManagerClient *manager,
|
|
|
fd368b |
g_variant_unref (properties);
|
|
|
fd368b |
}
|
|
|
fd368b |
|
|
|
fd368b |
+ if (added)
|
|
|
fd368b |
+ {
|
|
|
fd368b |
+ g_hash_table_insert (manager->priv->map_object_path_to_object_proxy,
|
|
|
fd368b |
+ g_strdup (object_path),
|
|
|
fd368b |
+ op);
|
|
|
fd368b |
+ }
|
|
|
fd368b |
+
|
|
|
fd368b |
g_mutex_unlock (&manager->priv->lock);
|
|
|
fd368b |
|
|
|
fd368b |
/* now that we don't hold the lock any more, emit signals */
|
|
|
fd368b |
@@ -1555,12 +1562,8 @@ add_interfaces (GDBusObjectManagerClient *manager,
|
|
|
fd368b |
g_list_free (interface_added_signals);
|
|
|
fd368b |
|
|
|
fd368b |
if (added)
|
|
|
fd368b |
- {
|
|
|
fd368b |
- g_hash_table_insert (manager->priv->map_object_path_to_object_proxy,
|
|
|
fd368b |
- g_strdup (object_path),
|
|
|
fd368b |
- op);
|
|
|
fd368b |
- g_signal_emit_by_name (manager, "object-added", op);
|
|
|
fd368b |
- }
|
|
|
fd368b |
+ g_signal_emit_by_name (manager, "object-added", op);
|
|
|
fd368b |
+
|
|
|
fd368b |
g_object_unref (manager);
|
|
|
fd368b |
g_object_unref (op);
|
|
|
fd368b |
}
|
|
|
fd368b |
--
|
|
|
fd368b |
2.14.2
|
|
|
fd368b |
|