From 05790fa731e8387ee3e3808c9e1ffb8058ebd3df Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 28 Sep 2015 10:04:25 +0300 Subject: [PATCH] audio/avrcp: Fix possible crash when current player is removed If current player is removed a new player should be assigned. Note: In normal condition this should never happen since player 0 works as a place holder but there have been some cases where addressed player changed don't match with any player returned by GetFolderList which cause a new player to be created and the old one to be destroyed. --- profiles/audio/avrcp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c index 24deac5fb..a3ed16a21 100644 --- a/profiles/audio/avrcp.c +++ b/profiles/audio/avrcp.c @@ -3320,10 +3320,15 @@ static void player_remove(gpointer data) for (l = player->sessions; l; l = l->next) { struct avrcp *session = l->data; + struct avrcp_data *controller = session->controller; - session->controller->players = g_slist_remove( - session->controller->players, - player); + controller->players = g_slist_remove(controller->players, + player); + + /* Check if current player is being removed */ + if (controller->player == player) + controller->player = g_slist_nth_data( + controller->players, 0); } player_destroy(player); @@ -3374,9 +3379,6 @@ static gboolean avrcp_get_media_player_list_rsp(struct avctp *conn, i += len; } - if (g_slist_find(removed, session->controller->player)) - session->controller->player = NULL; - g_slist_free_full(removed, player_remove); return FALSE; -- 2.47.3