diff --git a/NEWS b/NEWS
index dd8479049..ac1429960 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,6 @@
 ver 0.23.13 (not yet released)
+* input
+  - curl: fix busy loop after connection failed
 
 ver 0.23.12 (2023/01/17)
 * input
diff --git a/src/input/AsyncInputStream.cxx b/src/input/AsyncInputStream.cxx
index 38ae566ee..4b21f3391 100644
--- a/src/input/AsyncInputStream.cxx
+++ b/src/input/AsyncInputStream.cxx
@@ -101,9 +101,17 @@ AsyncInputStream::Seek(std::unique_lock<Mutex> &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");