From 9fa3984a2fd9ef6ca4a8843be78592c072e1705e Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Mon, 2 Aug 2021 16:33:33 +0200
Subject: [PATCH] input/icy: adjust offset at end of stream in Read()

ProxyInputStream::Read() assigns the `offset` field, which is the
wrong offset because it does not consider Icy metadata removed from
the stream.  Therefore, after every ProxyInputStream::Read() call,
IcyInputStream::Read() needs to override this offset.  This was
missing at the end of the stream, when Read()==0.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1216
---
 NEWS                         | 2 ++
 src/input/IcyInputStream.cxx | 5 ++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index e18e3ba81..a9cae45d1 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ ver 0.22.10 (not yet released)
   - support "albumart" for virtual tracks in CUE sheets
 * database
   - simple: fix crash bug
+* input
+  - curl: fix crash bug after stream with Icy metadata was closed by peer
 
 ver 0.22.9 (2021/06/23)
 * database
diff --git a/src/input/IcyInputStream.cxx b/src/input/IcyInputStream.cxx
index f24399e85..46ebeaca4 100644
--- a/src/input/IcyInputStream.cxx
+++ b/src/input/IcyInputStream.cxx
@@ -104,8 +104,11 @@ IcyInputStream::Read(std::unique_lock<Mutex> &lock,
 
 	while (true) {
 		size_t nbytes = ProxyInputStream::Read(lock, ptr, read_size);
-		if (nbytes == 0)
+		if (nbytes == 0) {
+			assert(IsEOF());
+			offset = override_offset;
 			return 0;
+		}
 
 		size_t result = parser->ParseInPlace(ptr, nbytes);
 		if (result > 0) {