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) {