From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ 7/7] profiles/audio: fix UAF on external media service teardown
Date: Thu, 2 Jul 2026 10:36:41 +0200 [thread overview]
Message-ID: <20260702083641.378994-7-frederic.danis@collabora.com> (raw)
In-Reply-To: <20260702083641.378994-1-frederic.danis@collabora.com>
Keep media_app endpoint/player queues in sync with object lifetime to
avoid stale pointers during proxy removal.
When admin allowlist reapply removes audio services, endpoint/player
objects may be destroyed through non-proxy paths first.
Later proxy_removed_cb calls queue_remove_if() and matching by path
can dereference freed endpoint/player memory.
Fix by:
- adding media_app back-references in media_endpoint/local_player
- unlinking from app queues inside media_endpoint_remove or
local_player_remove
- setting ownership when app-registering endpoint/player objects
This prevents heap-use-after-free in match_endpoint_by_path or
match_player_by_path during service disconnect.
Assisted-by: GPT:GPT-5.3-Codex
---
profiles/audio/media.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 5d9ea2cbc..95f9580b0 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -136,12 +136,14 @@ struct media_endpoint {
guint watch;
GSList *requests;
struct media_adapter *adapter;
+ struct media_app *app;
GSList *transports;
struct endpoint_features features;
};
struct local_player {
struct media_adapter *adapter;
+ struct media_app *app;
char *sender; /* Player DBus bus id */
char *path; /* Player object path */
GHashTable *settings; /* Player settings */
@@ -305,6 +307,11 @@ static void media_endpoint_remove(void *data)
}
#endif
+ if (endpoint->app) {
+ queue_remove(endpoint->app->endpoints, endpoint);
+ endpoint->app = NULL;
+ }
+
info("Endpoint unregistered: sender=%s path=%s", endpoint->sender,
endpoint->path);
@@ -2076,6 +2083,11 @@ static void local_player_remove(void *data)
{
struct local_player *mp = data;
+ if (mp->app) {
+ queue_remove(mp->app->players, mp);
+ mp->app = NULL;
+ }
+
info("Player unregistered: sender=%s path=%s", mp->sender, mp->path);
local_player_destroy(mp);
@@ -3168,6 +3180,8 @@ static void app_register_endpoint(void *data, void *user_data)
return;
}
+ endpoint->app = app;
+
queue_push_tail(app->endpoints, endpoint);
return;
@@ -3196,6 +3210,8 @@ static void app_register_player(void *data, void *user_data)
if (!player)
return;
+ player->app = app;
+
if (g_dbus_proxy_get_property(proxy, "PlaybackStatus", &iter)) {
if (!set_status(player, &iter))
goto fail;
--
2.43.0
next prev parent reply other threads:[~2026-07-02 8:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-02 8:36 [PATCH BlueZ 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
2026-07-02 8:36 ` [PATCH BlueZ 2/7] client/bluetoothctl: make admin.allow controller-aware Frédéric Danis
2026-07-02 8:36 ` [PATCH BlueZ 3/7] doc: document admin.allow optional controller argument Frédéric Danis
2026-07-02 8:36 ` [PATCH BlueZ 4/7] src/adapter: enforce allowlist for local services Frédéric Danis
2026-07-02 8:36 ` [PATCH BlueZ 5/7] plugins/admin: reapply allowlist on policy updates Frédéric Danis
2026-07-02 8:36 ` [PATCH BlueZ 6/7] doc: describe admin allowlist runtime enforcement Frédéric Danis
2026-07-02 8:36 ` Frédéric Danis [this message]
2026-07-02 11:57 ` [BlueZ,1/7] plugins/admin: make AdminPolicy state per-adapter bluez.test.bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260702083641.378994-7-frederic.danis@collabora.com \
--to=frederic.danis@collabora.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.