From 1bfa6a94e2259201068d7a947507eb5e6e93c0c3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 11 Nov 2008 20:46:55 +0100 Subject: [PATCH] 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(-) 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);