diff --git a/AK/BitStream.h b/AK/BitStream.h index 8684a349c2..623883d70b 100644 --- a/AK/BitStream.h +++ b/AK/BitStream.h @@ -40,8 +40,10 @@ public: size_t read(Bytes bytes) override { - size_t nread = 0; + if (has_any_error()) + return 0; + size_t nread = 0; if (bytes.size() >= 1) { if (m_next_byte.has_value()) { bytes[0] = m_next_byte.value(); diff --git a/AK/Buffered.h b/AK/Buffered.h index fc74fe1af0..e6f72a7d98 100644 --- a/AK/Buffered.h +++ b/AK/Buffered.h @@ -57,6 +57,9 @@ public: size_t read(Bytes bytes) override { + if (has_any_error()) + return 0; + auto nread = buffer().trim(m_buffer_remaining).copy_trimmed_to(bytes); m_buffer_remaining -= nread; diff --git a/AK/CircularDuplexStream.h b/AK/CircularDuplexStream.h index bc2d472825..36e19461ef 100644 --- a/AK/CircularDuplexStream.h +++ b/AK/CircularDuplexStream.h @@ -60,6 +60,9 @@ public: size_t read(Bytes bytes) override { + if (has_any_error()) + return 0; + const auto nread = min(bytes.size(), m_queue.size()); for (size_t idx = 0; idx < nread; ++idx) diff --git a/AK/MemoryStream.h b/AK/MemoryStream.h index b8bc5577ce..0e9bf11a56 100644 --- a/AK/MemoryStream.h +++ b/AK/MemoryStream.h @@ -44,6 +44,9 @@ public: size_t read(Bytes bytes) override { + if (has_any_error()) + return 0; + const auto count = min(bytes.size(), remaining()); __builtin_memcpy(bytes.data(), m_bytes.data() + m_offset, count); m_offset += count; @@ -239,6 +242,9 @@ public: size_t read(Bytes bytes) override { + if (has_any_error()) + return 0; + const auto nread = read_without_consuming(bytes); m_read_offset += nread; diff --git a/AK/Stream.h b/AK/Stream.h index 4c3dc389c8..d301c15052 100644 --- a/AK/Stream.h +++ b/AK/Stream.h @@ -75,6 +75,7 @@ namespace AK { class InputStream : public virtual AK::Detail::Stream { public: + // Does nothing and returns zero if there is already an error. virtual size_t read(Bytes) = 0; virtual bool read_or_error(Bytes) = 0; virtual bool eof() const = 0; diff --git a/Libraries/LibCompress/Deflate.cpp b/Libraries/LibCompress/Deflate.cpp index ca04508be3..b1f89b5f4c 100644 --- a/Libraries/LibCompress/Deflate.cpp +++ b/Libraries/LibCompress/Deflate.cpp @@ -189,8 +189,8 @@ DeflateDecompressor::~DeflateDecompressor() size_t DeflateDecompressor::read(Bytes bytes) { - // FIXME: There are surely a ton of bugs because we don't check for read errors - // very often. + if (has_any_error()) + return 0; if (m_state == State::Idle) { if (m_read_final_bock) diff --git a/Libraries/LibCompress/Gzip.cpp b/Libraries/LibCompress/Gzip.cpp index 0d47b166b1..f579f8ad12 100644 --- a/Libraries/LibCompress/Gzip.cpp +++ b/Libraries/LibCompress/Gzip.cpp @@ -68,6 +68,9 @@ GzipDecompressor::~GzipDecompressor() // FIXME: Again, there are surely a ton of bugs because the code doesn't check for read errors. size_t GzipDecompressor::read(Bytes bytes) { + if (has_any_error()) + return 0; + if (m_current_member.has_value()) { size_t nread = current_member().m_stream.read(bytes); current_member().m_checksum.update(bytes.trim(nread)); diff --git a/Libraries/LibCore/FileStream.h b/Libraries/LibCore/FileStream.h index 28975ff4d1..3b6f5efd68 100644 --- a/Libraries/LibCore/FileStream.h +++ b/Libraries/LibCore/FileStream.h @@ -65,6 +65,9 @@ public: size_t read(Bytes bytes) override { + if (has_any_error()) + return 0; + auto nread = m_buffered.bytes().copy_trimmed_to(bytes); m_buffered.bytes().slice(nread, m_buffered.size() - nread).copy_to(m_buffered);