Sfoglia il codice sorgente

LibCompress: Use newly created Zlib header structure when decompressing

This way we can get rid of some magic numbers.
Karol Kosek 3 anni fa
parent
commit
42abe1df77

+ 14 - 19
Userland/Libraries/LibCompress/Zlib.cpp

@@ -11,37 +11,32 @@
 
 
 namespace Compress {
 namespace Compress {
 
 
+constexpr static size_t Adler32Size = sizeof(u32);
+
 Optional<Zlib> Zlib::try_create(ReadonlyBytes data)
 Optional<Zlib> Zlib::try_create(ReadonlyBytes data)
 {
 {
-    if (data.size() < 6)
-        return {}; // header + footer size is 6
-
-    Zlib zlib { data };
-
-    u8 compression_info = data.at(0);
-    u8 flags = data.at(1);
+    if (data.size() < (sizeof(ZlibHeader) + Adler32Size))
+        return {};
 
 
-    zlib.m_compression_method = compression_info & 0xF;
-    zlib.m_compression_info = (compression_info >> 4) & 0xF;
-    zlib.m_check_bits = flags & 0xF;
-    zlib.m_has_dictionary = (flags >> 5) & 0x1;
-    zlib.m_compression_level = (flags >> 6) & 0x3;
+    ZlibHeader header { .as_u16 = data.at(0) << 8 | data.at(1) };
 
 
-    if (zlib.m_compression_method != 8 || zlib.m_compression_info > 7)
+    if (header.compression_method != ZlibCompressionMethod::Deflate || header.compression_info > 7)
         return {}; // non-deflate compression
         return {}; // non-deflate compression
 
 
-    if (zlib.m_has_dictionary)
+    if (header.present_dictionary)
         return {}; // we dont support pre-defined dictionaries
         return {}; // we dont support pre-defined dictionaries
 
 
-    if ((compression_info * 256 + flags) % 31 != 0)
+    if (header.as_u16 % 31 != 0)
         return {}; // error correction code doesn't match
         return {}; // error correction code doesn't match
 
 
-    zlib.m_data_bytes = data.slice(2, data.size() - 2 - 4);
+    Zlib zlib { header, data };
+    zlib.m_data_bytes = data.slice(2, data.size() - sizeof(ZlibHeader) - Adler32Size);
     return zlib;
     return zlib;
 }
 }
 
 
-Zlib::Zlib(ReadonlyBytes data)
-    : m_input_data(data)
+Zlib::Zlib(ZlibHeader header, ReadonlyBytes data)
+    : m_header(header)
+    , m_input_data(data)
 {
 {
 }
 }
 
 
@@ -61,7 +56,7 @@ Optional<ByteBuffer> Zlib::decompress_all(ReadonlyBytes bytes)
 u32 Zlib::checksum()
 u32 Zlib::checksum()
 {
 {
     if (!m_checksum) {
     if (!m_checksum) {
-        auto bytes = m_input_data.slice(m_input_data.size() - 4, 4);
+        auto bytes = m_input_data.slice_from_end(Adler32Size);
         m_checksum = bytes.at(0) << 24 | bytes.at(1) << 16 | bytes.at(2) << 8 || bytes.at(3);
         m_checksum = bytes.at(0) << 24 | bytes.at(1) << 16 | bytes.at(2) << 8 || bytes.at(3);
     }
     }
 
 

+ 2 - 6
Userland/Libraries/LibCompress/Zlib.h

@@ -48,13 +48,9 @@ public:
     static Optional<ByteBuffer> decompress_all(ReadonlyBytes);
     static Optional<ByteBuffer> decompress_all(ReadonlyBytes);
 
 
 private:
 private:
-    Zlib(ReadonlyBytes data);
+    Zlib(ZlibHeader, ReadonlyBytes data);
 
 
-    u8 m_compression_method;
-    u8 m_compression_info;
-    u8 m_check_bits;
-    u8 m_has_dictionary;
-    u8 m_compression_level;
+    ZlibHeader m_header;
 
 
     u32 m_checksum { 0 };
     u32 m_checksum { 0 };
     ReadonlyBytes m_input_data;
     ReadonlyBytes m_input_data;