From 9257fc0528c9aa51fac0f6df871344d8d386c26e Mon Sep 17 00:00:00 2001
From: Seungbae Shin <seungbae.shin@samsung.com>
Date: Thu, 23 Sep 2021 21:11:14 +0900
Subject: [PATCH] Fix memory leak in case of stopping playback

[Version] 0.3.6
[Issue Type] Bug

Change-Id: Ic3c4bc7378373909580ade0a261378a2031744dd
---
 packaging/capi-media-wav-player.spec |  2 +-
 src/wav_player_private.c             | 25 ++++++++++++++++---------
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/packaging/capi-media-wav-player.spec b/packaging/capi-media-wav-player.spec
index f407674..4350dc8 100755
--- a/packaging/capi-media-wav-player.spec
+++ b/packaging/capi-media-wav-player.spec
@@ -1,6 +1,6 @@
 Name:       capi-media-wav-player
 Summary:    A wav player library in Tizen C API
-Version:    0.3.5
+Version:    0.3.6
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
diff --git a/src/wav_player_private.c b/src/wav_player_private.c
index e7899cb..978ed5d 100755
--- a/src/wav_player_private.c
+++ b/src/wav_player_private.c
@@ -77,24 +77,31 @@ static void __internal_complete_cb(GDBusConnection *connection,
 					GVariant *params,
 					gpointer userdata)
 {
-	int handle;
+	gint handle = -1;
+	gboolean stopped_by_user = FALSE;
 	struct dbus_cb_data *dbus_data = (struct dbus_cb_data *)userdata;
 
-	g_variant_get(params, "(i)", &handle);
-
 	if (!dbus_data) {
-		LOGE("dbus data is null. handle(%d)", handle);
+		LOGE("dbus data is null");
 		return;
 	}
 
-	if (handle == dbus_data->handle) {
-		g_dbus_connection_signal_unsubscribe(dbus_data->conn, dbus_data->subs_id);
-		g_object_unref(dbus_data->conn);
+	g_variant_get(params, "(ib)", &handle, &stopped_by_user);
+	LOGI("expected handle(%d) callback(%p), incoming handle(%d), stopped_by_user(%d)",
+		dbus_data->handle, dbus_data->cb, handle, stopped_by_user);
+
+	if (handle != dbus_data->handle)
+		return;
+
+	g_dbus_connection_signal_unsubscribe(dbus_data->conn, dbus_data->subs_id);
+	g_object_unref(dbus_data->conn);
 
-		LOGD("user callback for handle(%d) cb(%p)", handle, dbus_data->cb);
+	if (!stopped_by_user) {
+		LOGI("Invoking user callback for handle(%d) cb(%p)", handle, dbus_data->cb);
 		dbus_data->cb(handle, dbus_data->user_data);
-		g_free(dbus_data);
 	}
+
+	g_free(dbus_data);
 }
 
 int _wav_play_sound(const char *path, sound_stream_info_h stream_info, unsigned loop_count,
-- 
2.34.1