From c30c293d6f9acd6c89d075c8004a6a4b60078af3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 28 Jan 2023 07:41:47 +0100 Subject: [PATCH] input/async: check for errors in Seek() Fixes a busy loop in BufferingInputStream::RunThreadLocked() because the method never learns that seeking is ignored, even though the HTTP stream is already broken and can never be read; nobody cared to check for errors. Closes https://github.com/MusicPlayerDaemon/MPD/issues/1727 --- NEWS | 1 + src/input/AsyncInputStream.cxx | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 788f93d53..1d21a4b98 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ ver 0.24 (not yet released) - add option to disable archive plugins in mpd.conf * input - curl: add "connect_timeout" configuration + - curl: fix busy loop after connection failed * decoder - hybrid_dsd: remove - opus: implement bitrate calculation diff --git a/src/input/AsyncInputStream.cxx b/src/input/AsyncInputStream.cxx index 9133dada4..2a117b4d6 100644 --- a/src/input/AsyncInputStream.cxx +++ b/src/input/AsyncInputStream.cxx @@ -102,9 +102,17 @@ AsyncInputStream::Seek(std::unique_lock &lock, assert(IsReady()); assert(seek_state == SeekState::NONE); - if (new_offset == offset) - /* no-op */ + if (new_offset == offset) { + /* no-op, but if the stream is not open anymore (maybe + because it has failed), nothing can be read, so we + should check for errors here instead of pretending + everything's fine */ + + if (!open) + Check(); + return; + } if (!IsSeekable()) throw std::runtime_error("Not seekable");