From 0a986f83c0cc936877263538474381583e644fcc Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 3 Jun 2016 11:05:00 +0300 Subject: [PATCH] audio/avrcp: Fix crash if no player is available It seems some Samsung Android devices may actually report no players at all causing the following crash: Program terminated with signal 11, Segmentation fault. #0 set_ct_player (player=0x0, session=) at profiles/audio/avrcp.c:3139 #1 0xb76c0aab in player_remove (data=0xb849a100) at profiles/audio/avrcp.c:3278 --- profiles/audio/avrcp.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c index 6c8ed815a..c100149ac 100644 --- a/profiles/audio/avrcp.c +++ b/profiles/audio/avrcp.c @@ -3200,7 +3200,8 @@ static void set_ct_player(struct avrcp *session, struct avrcp_player *player) session->controller->player = player; service = btd_device_get_service(session->dev, AVRCP_TARGET_UUID); - control_set_player(service, media_player_get_path(player->user_data)); + control_set_player(service, player ? + media_player_get_path(player->user_data) : NULL); } static struct avrcp_player *create_ct_player(struct avrcp *session, @@ -3330,6 +3331,10 @@ static void player_remove(gpointer data) struct avrcp_player *player = data; GSList *l; + /* Don't remove reserved player */ + if (!player->id) + return; + for (l = player->sessions; l; l = l->next) { struct avrcp *session = l->data; struct avrcp_data *controller = session->controller; @@ -3393,6 +3398,10 @@ static gboolean avrcp_get_media_player_list_rsp(struct avctp *conn, g_slist_free_full(removed, player_remove); + /* There should always be an active player */ + if (!session->controller->player) + create_ct_player(session, 0); + return FALSE; } -- 2.47.3