diff --git a/Userland/Libraries/LibCompress/Gzip.cpp b/Userland/Libraries/LibCompress/Gzip.cpp index 8e02d5afa1..8feb409cf1 100644 --- a/Userland/Libraries/LibCompress/Gzip.cpp +++ b/Userland/Libraries/LibCompress/Gzip.cpp @@ -78,6 +78,11 @@ size_t GzipDecompressor::read(Bytes bytes) current_member().m_checksum.update(bytes.trim(nread)); current_member().m_nread += nread; + if (current_member().m_stream.handle_any_error()) { + set_fatal_error(); + return 0; + } + if (nread < bytes.size()) { LittleEndian crc32, input_size; m_input_stream >> crc32 >> input_size; @@ -188,6 +193,12 @@ Optional GzipDecompressor::decompress_all(ReadonlyBytes bytes) bool GzipDecompressor::unreliable_eof() const { return m_eof; } +bool GzipDecompressor::handle_any_error() +{ + bool handled_errors = m_input_stream.handle_any_error(); + return Stream::handle_any_error() || handled_errors; +} + GzipCompressor::GzipCompressor(OutputStream& stream) : m_output_stream(stream) { diff --git a/Userland/Libraries/LibCompress/Gzip.h b/Userland/Libraries/LibCompress/Gzip.h index f380296649..0b7d21068a 100644 --- a/Userland/Libraries/LibCompress/Gzip.h +++ b/Userland/Libraries/LibCompress/Gzip.h @@ -67,6 +67,7 @@ public: bool discard_or_error(size_t) override; bool unreliable_eof() const override; + bool handle_any_error() override; static Optional decompress_all(ReadonlyBytes); static bool is_likely_compressed(ReadonlyBytes bytes);