mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-22 18:22:11 +01:00
gdbusconnection: Disallow subscribers for implicit match rules
While it's true that GDBus makes no ordering guarantees about the order of callbacks for signals subscriptions for the same signal, it's still a good idea not to change the order if we don't have to. Since g_dbus_connection_signal_subscribe started tracking name owners itself, the order of NameOwnerChanged handlers can change counterintuitively because that tracking creates a match rule implicitly, that future subscribers can use for their subscriptions. This commit just adds a minor change to the syntax for those implicit match rules, so explicit match rules will always be treated distinctly. The change is to add a leading "*" to the match rule that later gets filtered out when sending the match rule to the bus.
This commit is contained in:
parent
47866d252f
commit
19a5ce6a14
@ -3603,13 +3603,14 @@ args_to_rule (const gchar *sender,
|
|||||||
const gchar *member,
|
const gchar *member,
|
||||||
const gchar *object_path,
|
const gchar *object_path,
|
||||||
const gchar *arg0,
|
const gchar *arg0,
|
||||||
|
const gchar header_tag,
|
||||||
GDBusSignalFlags flags)
|
GDBusSignalFlags flags)
|
||||||
{
|
{
|
||||||
GString *rule;
|
GString *rule;
|
||||||
|
|
||||||
rule = g_string_new ("type='signal'");
|
rule = g_string_new ("type='signal'");
|
||||||
if (flags & G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE)
|
if (header_tag != '\0')
|
||||||
g_string_prepend_c (rule, '-');
|
g_string_prepend_c (rule, header_tag);
|
||||||
if (sender != NULL)
|
if (sender != NULL)
|
||||||
g_string_append_printf (rule, ",sender='%s'", sender);
|
g_string_append_printf (rule, ",sender='%s'", sender);
|
||||||
if (interface_name != NULL)
|
if (interface_name != NULL)
|
||||||
@ -3646,6 +3647,9 @@ add_match_rule (GDBusConnection *connection,
|
|||||||
GError *error;
|
GError *error;
|
||||||
GDBusMessage *message;
|
GDBusMessage *message;
|
||||||
|
|
||||||
|
if (match_rule[0] == '*')
|
||||||
|
match_rule++;
|
||||||
|
|
||||||
if (match_rule[0] == '-')
|
if (match_rule[0] == '-')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3677,6 +3681,9 @@ remove_match_rule (GDBusConnection *connection,
|
|||||||
GError *error;
|
GError *error;
|
||||||
GDBusMessage *message;
|
GDBusMessage *message;
|
||||||
|
|
||||||
|
if (match_rule[0] == '*')
|
||||||
|
match_rule++;
|
||||||
|
|
||||||
if (match_rule[0] == '-')
|
if (match_rule[0] == '-')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3840,6 +3847,7 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GDestroyNotify user_data_free_func)
|
GDestroyNotify user_data_free_func)
|
||||||
{
|
{
|
||||||
|
gchar header_tag = '\0';
|
||||||
gchar *rule;
|
gchar *rule;
|
||||||
SignalData *signal_data;
|
SignalData *signal_data;
|
||||||
SignalData *name_watcher = NULL;
|
SignalData *name_watcher = NULL;
|
||||||
@ -3877,7 +3885,9 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
* the usual way, but the '-' prevents the match rule from ever
|
* the usual way, but the '-' prevents the match rule from ever
|
||||||
* actually being send to the bus (either for add or remove).
|
* actually being send to the bus (either for add or remove).
|
||||||
*/
|
*/
|
||||||
rule = args_to_rule (sender, interface_name, member, object_path, arg0, flags);
|
if (flags & G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE)
|
||||||
|
header_tag = '-';
|
||||||
|
rule = args_to_rule (sender, interface_name, member, object_path, arg0, header_tag, flags);
|
||||||
|
|
||||||
if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0))
|
if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0))
|
||||||
sender_is_its_own_owner = TRUE;
|
sender_is_its_own_owner = TRUE;
|
||||||
@ -3926,11 +3936,15 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
/* We already checked that sender != NULL implies MESSAGE_BUS_CONNECTION */
|
/* We already checked that sender != NULL implies MESSAGE_BUS_CONNECTION */
|
||||||
g_assert (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION);
|
g_assert (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION);
|
||||||
|
|
||||||
|
/* We pass a prefix of "*" to mean it's an internal match rule and shouldn't gain
|
||||||
|
* subscribers
|
||||||
|
*/
|
||||||
name_owner_rule = args_to_rule (DBUS_SERVICE_DBUS,
|
name_owner_rule = args_to_rule (DBUS_SERVICE_DBUS,
|
||||||
DBUS_INTERFACE_DBUS,
|
DBUS_INTERFACE_DBUS,
|
||||||
"NameOwnerChanged",
|
"NameOwnerChanged",
|
||||||
DBUS_PATH_DBUS,
|
DBUS_PATH_DBUS,
|
||||||
sender,
|
sender,
|
||||||
|
'*',
|
||||||
G_DBUS_SIGNAL_FLAGS_NONE);
|
G_DBUS_SIGNAL_FLAGS_NONE);
|
||||||
name_watcher = g_hash_table_lookup (connection->map_rule_to_signal_data, name_owner_rule);
|
name_watcher = g_hash_table_lookup (connection->map_rule_to_signal_data, name_owner_rule);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user