mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-24 11:12:11 +01:00
GDbusDaemon: Handle Names with NULL owner
Generally Names should not exist with a NULL owner, but they can be around temporarily, like when broadcasting the NameOwnerChanged message during name release.
This commit is contained in:
parent
bc2dcfd6ad
commit
bc2f7c1a06
@ -573,7 +573,7 @@ match_matches (GDBusDaemon *daemon,
|
|||||||
break;
|
break;
|
||||||
case CHECK_TYPE_NAME:
|
case CHECK_TYPE_NAME:
|
||||||
name = name_lookup (daemon, element->value);
|
name = name_lookup (daemon, element->value);
|
||||||
if (name != NULL)
|
if (name != NULL && name->owner != NULL)
|
||||||
{
|
{
|
||||||
if (strcmp (name->owner->client->id, value) != 0)
|
if (strcmp (name->owner->client->id, value) != 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -847,7 +847,7 @@ client_free (Client *client)
|
|||||||
|
|
||||||
name_ref (name);
|
name_ref (name);
|
||||||
|
|
||||||
if (name->owner->client == client)
|
if (name->owner && name->owner->client == client)
|
||||||
name_release_owner (name);
|
name_release_owner (name);
|
||||||
|
|
||||||
name_unqueue_owner (name, client);
|
name_unqueue_owner (name, client);
|
||||||
@ -962,7 +962,7 @@ handle_get_name_owner (_GFreedesktopDBus *object,
|
|||||||
}
|
}
|
||||||
|
|
||||||
name = name_lookup (daemon, arg_name);
|
name = name_lookup (daemon, arg_name);
|
||||||
if (name == NULL)
|
if (name == NULL || name->owner == NULL)
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation,
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER,
|
G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER,
|
||||||
@ -970,8 +970,6 @@ handle_get_name_owner (_GFreedesktopDBus *object,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (name->owner != NULL);
|
|
||||||
|
|
||||||
_g_freedesktop_dbus_complete_get_name_owner (object, invocation, name->owner->client->id);
|
_g_freedesktop_dbus_complete_get_name_owner (object, invocation, name->owner->client->id);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -1057,10 +1055,8 @@ handle_list_queued_owners (_GFreedesktopDBus *object,
|
|||||||
array = g_ptr_array_new ();
|
array = g_ptr_array_new ();
|
||||||
|
|
||||||
name = name_lookup (daemon, arg_name);
|
name = name_lookup (daemon, arg_name);
|
||||||
if (name)
|
if (name && name->owner)
|
||||||
{
|
{
|
||||||
g_assert (name->owner != NULL);
|
|
||||||
|
|
||||||
for (l = name->queue; l != NULL; l = l->next)
|
for (l = name->queue; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
Client *client = l->data;
|
Client *client = l->data;
|
||||||
@ -1131,7 +1127,7 @@ handle_release_name (_GFreedesktopDBus *object,
|
|||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
result = DBUS_RELEASE_NAME_REPLY_NON_EXISTENT;
|
result = DBUS_RELEASE_NAME_REPLY_NON_EXISTENT;
|
||||||
else if (name->owner->client == client)
|
else if (name->owner && name->owner->client == client)
|
||||||
{
|
{
|
||||||
name_release_owner (name);
|
name_release_owner (name);
|
||||||
result = DBUS_RELEASE_NAME_REPLY_RELEASED;
|
result = DBUS_RELEASE_NAME_REPLY_RELEASED;
|
||||||
@ -1238,7 +1234,7 @@ handle_request_name (_GFreedesktopDBus *object,
|
|||||||
|
|
||||||
result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
|
result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER;
|
||||||
}
|
}
|
||||||
else if (name->owner->client == client)
|
else if (name->owner && name->owner->client == client)
|
||||||
{
|
{
|
||||||
name->owner->flags = flags;
|
name->owner->flags = flags;
|
||||||
result = DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER;
|
result = DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER;
|
||||||
@ -1349,12 +1345,9 @@ route_message (Client *source_client, GDBusMessage *message)
|
|||||||
{
|
{
|
||||||
Name *name;
|
Name *name;
|
||||||
name = name_lookup (daemon, dest);
|
name = name_lookup (daemon, dest);
|
||||||
if (name)
|
if (name && name->owner)
|
||||||
{
|
|
||||||
g_assert (name->owner != NULL);
|
|
||||||
dest_client = name->owner->client;
|
dest_client = name->owner->client;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (dest_client == NULL)
|
if (dest_client == NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user