From 1bfa6a94e2259201068d7a947507eb5e6e93c0c3 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Tue, 11 Nov 2008 20:46:55 +0100
Subject: player: fix race condition during tag update

When a tag is updated, the old tag was freed before the new one was
created.  Reverse the order to be sure that other threads always see a
valid pointer.

This still leaves a possible race condition, but it will be addressed
later.
---
 src/player_thread.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/player_thread.c b/src/player_thread.c
index 30f876fe0..ddd87cc06 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -225,11 +225,13 @@ play_chunk(struct song *song, struct music_chunk *chunk,
 
 		if (!song_is_file(song)) {
 			/* always update the tag of remote streams */
+			struct tag *old_tag = song->tag;
 
-			if (song->tag != NULL)
-				tag_free(song->tag);
 			song->tag = tag_dup(chunk->tag);
 
+			if (old_tag != NULL)
+				tag_free(old_tag);
+
 			/* notify all clients that the tag of the
 			   current song has changed */
 			idle_add(IDLE_PLAYER);
-- 
cgit v1.2.3