audio/avrcp: Fix possible crash when current player is removed 56/53756/1
authorBharat Panda <bharat.panda@samsung.com>
Wed, 9 Dec 2015 06:59:41 +0000 (12:29 +0530)
committerBharat Panda <bharat.panda@samsung.com>
Wed, 9 Dec 2015 07:02:39 +0000 (12:32 +0530)
If current player is removed a new player should be assigned.

This is needed as the crash is obsereved while removing the
assinged player.

git repo link:
http://git.kernel.org/cgit/bluetooth/bluez.git/commit/?id=05790fa731e8387ee3e3808c9e1ffb8058ebd3df

Change-Id: I3d66215e4af97b34155b74358ea0e76d7d3fde43

profiles/audio/avrcp.c

index fa19d6d..058fc00 100644 (file)
@@ -3358,10 +3358,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);
@@ -3412,9 +3417,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;