From a1039eeece3b0a81e0cf732a885b1c5bef60341f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Danis?= Date: Wed, 30 Mar 2022 11:28:44 +0200 Subject: [PATCH] a2dp: Fix crash when SEP codec has not been initialized If SEP has not been properly discovered avdtp_get_codec may return NULL thus causing crashes such as when running AVRCP/TG/VLH/BI-01-C after AVRCP/TG/RCR/BV-04-C. Prevent remote endpoint registration if its codec is not available. Remove queue_isempty check from store_remote_seps since that prevents cleaning up if no seps could be registered. Signed-off-by: Manika Shrivastava Signed-off-by: Ayush Garg --- profiles/audio/a2dp.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c index 94bde3d..afcd0f2 100644 --- a/profiles/audio/a2dp.c +++ b/profiles/audio/a2dp.c @@ -883,9 +883,6 @@ static void store_remote_seps(struct a2dp_channel *chan) char *data; gsize length = 0; - if (queue_isempty(chan->seps)) - return; - ba2str(device_get_address(device), dst_addr); snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", @@ -2177,6 +2174,11 @@ static struct a2dp_remote_sep *register_remote_sep(void *data, void *user_data) if (sep) return sep; + if (!avdtp_get_codec(rsep)) { + error("Unable to get remote sep codec"); + return NULL; + } + sep = new0(struct a2dp_remote_sep, 1); sep->chan = chan; sep->sep = rsep; @@ -2251,6 +2253,7 @@ static void load_remote_sep(struct a2dp_channel *chan, GKeyFile *key_file, struct avdtp_remote_sep *rsep; uint8_t lseid, rseid; char *value; + bool update = false; if (!seids) return; @@ -2309,10 +2312,19 @@ static void load_remote_sep(struct a2dp_channel *chan, GKeyFile *key_file, } sep = register_remote_sep(rsep, chan); - if (sep) - sep->from_cache = true; + if (!sep) { + avdtp_unregister_remote_sep(chan->session, rsep); + update = true; + continue; + } + + sep->from_cache = true; } + /* Update cache */ + if (update) + store_remote_seps(chan); + value = g_key_file_get_string(key_file, "Endpoints", "LastUsed", NULL); if (!value) return; -- 2.7.4