diff --git a/Libraries/LibCompress/Gzip.cpp b/Libraries/LibCompress/Gzip.cpp index 956b4f011c..0d47b166b1 100644 --- a/Libraries/LibCompress/Gzip.cpp +++ b/Libraries/LibCompress/Gzip.cpp @@ -78,6 +78,8 @@ size_t GzipDecompressor::read(Bytes bytes) m_input_stream >> crc32 >> input_size; if (crc32 != current_member().m_checksum.digest()) { + // FIXME: Somehow the checksum is incorrect? + set_fatal_error(); return 0; } diff --git a/Userland/test-compress.cpp b/Userland/test-compress.cpp index 321c97bc80..04c4b10cde 100644 --- a/Userland/test-compress.cpp +++ b/Userland/test-compress.cpp @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -127,7 +128,6 @@ TEST_CASE(gzip_decompress_simple) const u8 uncompressed[] = "word1 abc word2"; const auto decompressed = Compress::GzipDecompressor::decompress_all({ compressed, sizeof(compressed) }); - EXPECT(compare({ uncompressed, sizeof(uncompressed) - 1 }, decompressed.bytes())); } @@ -145,7 +145,6 @@ TEST_CASE(gzip_decompress_multiple_members) const u8 uncompressed[] = "abcabcabcabc"; const auto decompressed = Compress::GzipDecompressor::decompress_all({ compressed, sizeof(compressed) }); - EXPECT(compare({ uncompressed, sizeof(uncompressed) - 1 }, decompressed.bytes())); } @@ -171,8 +170,27 @@ TEST_CASE(gzip_decompress_zeroes) const u8 uncompressed[128 * 1024] = { 0 }; const auto decompressed = Compress::GzipDecompressor::decompress_all({ compressed, sizeof(compressed) }); - EXPECT(compare({ uncompressed, sizeof(uncompressed) }, decompressed.bytes())); } +TEST_CASE(gzip_decompress_repeat_around_buffer) +{ + const u8 compressed[] = { + 0x1f, 0x8b, 0x08, 0x00, 0xc6, 0x74, 0x53, 0x5f, 0x02, 0xff, 0xed, 0xc1, + 0x01, 0x0d, 0x00, 0x00, 0x0c, 0x02, 0xa0, 0xdb, 0xbf, 0xf4, 0x37, 0x6b, + 0x08, 0x24, 0xdb, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xca, + 0xb8, 0x07, 0xcd, 0xe5, 0x38, 0xfa, 0x00, 0x80, 0x00, 0x00 + }; + + FixedArray uncompressed { 0x8000 }; + uncompressed.bytes().slice(0x0, 0x100).fill(1); + uncompressed.bytes().slice(0x100, 0x7e00).fill(0); + uncompressed.bytes().slice(0x7f00, 0x100).fill(1); + + const auto decompressed = Compress::GzipDecompressor::decompress_all({ compressed, sizeof(compressed) }); + EXPECT(compare(uncompressed, decompressed.bytes())); +} + TEST_MAIN(Compress)