From dca4d9cf83849877206379a20a1e478ed1b5dc55 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 11 Nov 2009 08:55:55 +0100
Subject: [PATCH] decoder/flac: fixed CUE seeking range check

If flac_container_decode() gets a seek destination which is out of
range, it ignores the SEEK command (never finishes it).  This leads to
MPD lockup, because the player thread waits for completion.
---
 NEWS                      |  1 +
 src/decoder/flac_plugin.c | 22 ++++++++--------------
 2 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/NEWS b/NEWS
index c04241c34..f1bdfeb1d 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ ver 0.15.6 (2009/??/??)
 * decoders:
   - ffmpeg: convert metadata
   - oggflac: rewind stream after FLAC detection
+  - flac: fixed CUE seeking range check
 * output_thread: check again if output is open on PAUSE
 * update: delete ignored symlinks from database
 * database: increased maximum line length to 32 kB
diff --git a/src/decoder/flac_plugin.c b/src/decoder/flac_plugin.c
index 1d5d48d09..0c0d994b7 100644
--- a/src/decoder/flac_plugin.c
+++ b/src/decoder/flac_plugin.c
@@ -629,21 +629,15 @@ flac_container_decode(struct decoder* decoder,
 			FLAC__uint64 seek_sample = t_start +
 				(decoder_seek_where(decoder) * data.audio_format.sample_rate);
 
-			//if (seek_sample >= t_start && seek_sample <= t_end && data.total_time > 30)
-			if (seek_sample >= t_start && seek_sample <= t_end)
-			{
-				if (flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample))
-				{
-					data.time = (float)(seek_sample - t_start) /
-					    data.audio_format.sample_rate;
-					data.position = 0;
+			if (seek_sample >= t_start && seek_sample <= t_end &&
+			    flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) {
+				data.time = (float)(seek_sample - t_start) /
+					data.audio_format.sample_rate;
+				data.position = 0;
 
-					decoder_command_finished(decoder);
-				}
-				else
-					decoder_seek_error(decoder);
-					//decoder_command_finished(decoder);
-			}
+				decoder_command_finished(decoder);
+			} else
+				decoder_seek_error(decoder);
 		}
 		else if (flac_get_state(flac_dec) == flac_decoder_eof)
 			break;