Diff between bcb96cdde52b66eaca3ca976cd354466fa35033d and 44a6633229363cd7a37ed5ed11476771f9b7beb6

Changed Files

File Additions Deletions Status
profiles/audio/avrcp.c +32 -22 modified

Full Patch

diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 4d39a01..58aefb4 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -2787,9 +2787,9 @@ void avrcp_disconnect(struct audio_device *dev)
 	avctp_disconnect(session);
 }
 
-int avrcp_register(struct btd_adapter *adapter, GKeyFile *config)
+static struct avrcp_server *avrcp_server_register(struct btd_adapter *adapter,
+							GKeyFile *config)
 {
-	sdp_record_t *record;
 	gboolean tmp, master = TRUE;
 	GError *err = NULL;
 	struct avrcp_server *server;
@@ -2804,18 +2804,39 @@ int avrcp_register(struct btd_adapter *adapter, GKeyFile *config)
 			master = tmp;
 	}
 
+	if (avctp_register(adapter, master) < 0)
+		return NULL;
+
 	server = g_new0(struct avrcp_server, 1);
+	server->adapter = btd_adapter_ref(adapter);
+
+	servers = g_slist_append(servers, server);
+
+	if (!avctp_id)
+		avctp_id = avctp_add_state_cb(NULL, state_changed);
+
+	return server;
+}
+
+int avrcp_register(struct btd_adapter *adapter, GKeyFile *config)
+{
+	sdp_record_t *record;
+	struct avrcp_server *server;
+
+	server = avrcp_server_register(adapter, config);
+	if (server == NULL)
+		return -EPROTONOSUPPORT;
 
 	record = avrcp_tg_record();
 	if (!record) {
 		error("Unable to allocate new service record");
-		g_free(server);
+		avrcp_unregister(adapter);
 		return -1;
 	}
 
 	if (add_record_to_server(adapter_get_address(adapter), record) < 0) {
 		error("Unable to register AVRCP target service record");
-		g_free(server);
+		avrcp_unregister(adapter);
 		sdp_record_free(record);
 		return -1;
 	}
@@ -2824,32 +2845,18 @@ int avrcp_register(struct btd_adapter *adapter, GKeyFile *config)
 	record = avrcp_ct_record();
 	if (!record) {
 		error("Unable to allocate new service record");
-		g_free(server);
+		avrcp_unregister(adapter);
 		return -1;
 	}
 
 	if (add_record_to_server(adapter_get_address(adapter), record) < 0) {
 		error("Unable to register AVRCP service record");
 		sdp_record_free(record);
-		g_free(server);
+		avrcp_unregister(adapter);
 		return -1;
 	}
 	server->ct_record_id = record->handle;
 
-	if (avctp_register(adapter, master) < 0) {
-		remove_record_from_server(server->ct_record_id);
-		remove_record_from_server(server->tg_record_id);
-		g_free(server);
-		return -1;
-	}
-
-	server->adapter = btd_adapter_ref(adapter);
-
-	servers = g_slist_append(servers, server);
-
-	if (!avctp_id)
-		avctp_id = avctp_add_state_cb(NULL, state_changed);
-
 	return 0;
 }
 
@@ -2866,8 +2873,11 @@ void avrcp_unregister(struct btd_adapter *adapter)
 
 	servers = g_slist_remove(servers, server);
 
-	remove_record_from_server(server->ct_record_id);
-	remove_record_from_server(server->tg_record_id);
+	if (server->ct_record_id != 0)
+		remove_record_from_server(server->ct_record_id);
+
+	if (server->tg_record_id != 0)
+		remove_record_from_server(server->tg_record_id);
 
 	avctp_unregister(server->adapter);
 	btd_adapter_unref(server->adapter);