diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-05-11 13:23:40 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-05-12 13:31:53 -0700 |
commit | 1707c35771b447e39d19ebcc477e46e26d5870b5 (patch) | |
tree | 924c672e0c2951c21cdf465bbd39ab5077b4a05e | |
parent | fe16cf2a7ee343e6741bc1ef8f45f4f9dbf5c8a2 (diff) | |
download | bluez-1707c35771b447e39d19ebcc477e46e26d5870b5.tar.gz |
client/player: Fix not checking for SupportedUUIDs
When registering an endpoint it should always check for SupportedUUIDs.
-rw-r--r-- | client/player.c | 66 |
1 files changed, 42 insertions, 24 deletions
diff --git a/client/player.c b/client/player.c index d14292874..58e14654f 100644 --- a/client/player.c +++ b/client/player.c @@ -2073,9 +2073,32 @@ static void register_endpoint_reply(DBusMessage *message, void *user_data) return bt_shell_noninteractive_quit(EXIT_SUCCESS); } +static bool media_supports_uuid(GDBusProxy *proxy, const char *uuid) +{ + DBusMessageIter iter, array; + + if (!g_dbus_proxy_get_property(proxy, "SupportedUUIDs", &iter)) + return false; + + dbus_message_iter_recurse(&iter, &array); + while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) { + const char *support_uuid; + + dbus_message_iter_get_basic(&array, &support_uuid); + + if (!strcasecmp(uuid, support_uuid)) + return true; + + dbus_message_iter_next(&array); + } + + return false; +} + static void endpoint_register(struct endpoint *ep) { GList *l; + int registered = 0; if (!g_dbus_register_interface(dbus_conn, ep->path, BLUEZ_MEDIA_ENDPOINT_INTERFACE, @@ -2086,6 +2109,9 @@ static void endpoint_register(struct endpoint *ep) } for (l = medias; l; l = g_list_next(l)) { + if (!media_supports_uuid(l->data, ep->uuid)) + continue; + if (!g_dbus_proxy_method_call(l->data, "RegisterEndpoint", register_endpoint_setup, register_endpoint_reply, @@ -2094,8 +2120,13 @@ static void endpoint_register(struct endpoint *ep) BLUEZ_MEDIA_ENDPOINT_INTERFACE); goto fail; } + + registered++; } + if (!registered) + goto fail; + return; fail: @@ -2898,33 +2929,20 @@ static struct endpoint *endpoint_new(const struct capabilities *cap) static void register_endpoints(GDBusProxy *proxy) { struct endpoint *ep; - DBusMessageIter iter, array; - - if (!g_dbus_proxy_get_property(proxy, "SupportedUUIDs", &iter)) - return; - - dbus_message_iter_recurse(&iter, &array); - while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRING) { - const char *uuid; - size_t i; - - dbus_message_iter_get_basic(&array, &uuid); - - for (i = 0; i < ARRAY_SIZE(caps); i++) { - const struct capabilities *cap = &caps[i]; + size_t i; - if (strcasecmp(cap->uuid, uuid)) - continue; + for (i = 0; i < ARRAY_SIZE(caps); i++) { + const struct capabilities *cap = &caps[i]; - ep = endpoint_new(cap); - ep->max_transports = UINT8_MAX; - ep->auto_accept = true; - ep->cig = BT_ISO_QOS_CIG_UNSET; - ep->cis = BT_ISO_QOS_CIS_UNSET; - endpoint_register(ep); - } + if (!media_supports_uuid(proxy, cap->uuid)) + continue; - dbus_message_iter_next(&array); + ep = endpoint_new(cap); + ep->max_transports = UINT8_MAX; + ep->auto_accept = true; + ep->cig = BT_ISO_QOS_CIG_UNSET; + ep->cis = BT_ISO_QOS_CIS_UNSET; + endpoint_register(ep); } } |