mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-20 15:48:54 +02:00
GDBusObjectManagerServer: Use correct object path in export_uniquely() method
In registration_data_export_interface(), the object_path is obtained using: object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); But when exporting an object uniquely, the object_path is not assigned to the GDBusObject until after all the interfaces are exported. Therefore, registration_data_export_interface() is trying to export the interface on the non-unique object path, which can lead to run-time errors if an object already exists on that path. Instead, registration_data_export_interface() should be passed the object_path explicitly, as is done in g_dbus_object_manager_server_export_unlocked(). Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
committed by
David Zeuthen
parent
fe27bf0037
commit
b1c08ca419
@@ -69,7 +69,8 @@ static void unexport_all (GDBusObjectManagerServer *manager, gboolean only_manag
|
|||||||
|
|
||||||
static void g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
|
static void g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
|
||||||
RegistrationData *data,
|
RegistrationData *data,
|
||||||
const gchar *const *interfaces);
|
const gchar *const *interfaces,
|
||||||
|
const gchar *object_path);
|
||||||
|
|
||||||
static void g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager,
|
static void g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager,
|
||||||
RegistrationData *data,
|
RegistrationData *data,
|
||||||
@@ -329,13 +330,11 @@ g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
registration_data_export_interface (RegistrationData *data,
|
registration_data_export_interface (RegistrationData *data,
|
||||||
GDBusInterfaceSkeleton *interface_skeleton)
|
GDBusInterfaceSkeleton *interface_skeleton,
|
||||||
|
const gchar *object_path)
|
||||||
{
|
{
|
||||||
GDBusInterfaceInfo *info;
|
GDBusInterfaceInfo *info;
|
||||||
GError *error;
|
GError *error;
|
||||||
const gchar *object_path;
|
|
||||||
|
|
||||||
object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object));
|
|
||||||
|
|
||||||
info = g_dbus_interface_skeleton_get_info (interface_skeleton);
|
info = g_dbus_interface_skeleton_get_info (interface_skeleton);
|
||||||
error = NULL;
|
error = NULL;
|
||||||
@@ -367,7 +366,7 @@ registration_data_export_interface (RegistrationData *data,
|
|||||||
/* emit InterfacesAdded on the ObjectManager object */
|
/* emit InterfacesAdded on the ObjectManager object */
|
||||||
interfaces[0] = info->name;
|
interfaces[0] = info->name;
|
||||||
interfaces[1] = NULL;
|
interfaces[1] = NULL;
|
||||||
g_dbus_object_manager_server_emit_interfaces_added (data->manager, data, interfaces);
|
g_dbus_object_manager_server_emit_interfaces_added (data->manager, data, interfaces, object_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,8 +405,10 @@ on_interface_added (GDBusObject *object,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
RegistrationData *data = user_data;
|
RegistrationData *data = user_data;
|
||||||
|
const gchar *object_path;
|
||||||
g_mutex_lock (data->manager->priv->lock);
|
g_mutex_lock (data->manager->priv->lock);
|
||||||
registration_data_export_interface (data, G_DBUS_INTERFACE_SKELETON (interface));
|
object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object));
|
||||||
|
registration_data_export_interface (data, G_DBUS_INTERFACE_SKELETON (interface), object_path);
|
||||||
g_mutex_unlock (data->manager->priv->lock);
|
g_mutex_unlock (data->manager->priv->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,7 +494,7 @@ g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer *manager
|
|||||||
for (l = existing_interfaces; l != NULL; l = l->next)
|
for (l = existing_interfaces; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data);
|
GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data);
|
||||||
registration_data_export_interface (data, interface_skeleton);
|
registration_data_export_interface (data, interface_skeleton, object_path);
|
||||||
g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name);
|
g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name);
|
||||||
}
|
}
|
||||||
g_list_foreach (existing_interfaces, (GFunc) g_object_unref, NULL);
|
g_list_foreach (existing_interfaces, (GFunc) g_object_unref, NULL);
|
||||||
@@ -503,7 +504,7 @@ g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer *manager
|
|||||||
data->exported = TRUE;
|
data->exported = TRUE;
|
||||||
|
|
||||||
/* now emit InterfacesAdded() for all the interfaces */
|
/* now emit InterfacesAdded() for all the interfaces */
|
||||||
g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata);
|
g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata, object_path);
|
||||||
g_ptr_array_unref (interface_names);
|
g_ptr_array_unref (interface_names);
|
||||||
|
|
||||||
g_hash_table_insert (manager->priv->map_object_path_to_data,
|
g_hash_table_insert (manager->priv->map_object_path_to_data,
|
||||||
@@ -866,12 +867,12 @@ g_dbus_object_manager_server_constructed (GObject *object)
|
|||||||
static void
|
static void
|
||||||
g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
|
g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager,
|
||||||
RegistrationData *data,
|
RegistrationData *data,
|
||||||
const gchar *const *interfaces)
|
const gchar *const *interfaces,
|
||||||
|
const gchar *object_path)
|
||||||
{
|
{
|
||||||
GVariantBuilder array_builder;
|
GVariantBuilder array_builder;
|
||||||
GError *error;
|
GError *error;
|
||||||
guint n;
|
guint n;
|
||||||
const gchar *object_path;
|
|
||||||
|
|
||||||
if (data->manager->priv->connection == NULL)
|
if (data->manager->priv->connection == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -890,7 +891,6 @@ g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *ma
|
|||||||
}
|
}
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object));
|
|
||||||
g_dbus_connection_emit_signal (data->manager->priv->connection,
|
g_dbus_connection_emit_signal (data->manager->priv->connection,
|
||||||
NULL, /* destination_bus_name */
|
NULL, /* destination_bus_name */
|
||||||
manager->priv->object_path,
|
manager->priv->object_path,
|
||||||
|
Reference in New Issue
Block a user