24
24
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
25
*/
26
26
27
- #include < AK/Assertions.h>
28
27
#include < AK/Span.h>
29
28
#include < AK/Types.h>
30
29
#include < AK/Vector.h>
33
32
34
33
namespace Compress {
35
34
36
- Zlib::Zlib (ReadonlyBytes data)
35
+ Optional< Zlib> Zlib::try_create (ReadonlyBytes data)
37
36
{
38
- m_input_data = data;
37
+ if (data.size () < 6 )
38
+ return {}; // header + footer size is 6
39
+
40
+ Zlib zlib { data };
39
41
40
42
u8 compression_info = data.at (0 );
41
43
u8 flags = data.at (1 );
42
44
43
- m_compression_method = compression_info & 0xF ;
44
- m_compression_info = (compression_info >> 4 ) & 0xF ;
45
- m_check_bits = flags & 0xF ;
46
- m_has_dictionary = (flags >> 5 ) & 0x1 ;
47
- m_compression_level = (flags >> 6 ) & 0x3 ;
48
- m_checksum = 0 ;
45
+ zlib.m_compression_method = compression_info & 0xF ;
46
+ zlib.m_compression_info = (compression_info >> 4 ) & 0xF ;
47
+ zlib.m_check_bits = flags & 0xF ;
48
+ zlib.m_has_dictionary = (flags >> 5 ) & 0x1 ;
49
+ zlib.m_compression_level = (flags >> 6 ) & 0x3 ;
50
+
51
+ if (zlib.m_compression_method != 8 || zlib.m_compression_info > 7 )
52
+ return {}; // non-deflate compression
53
+
54
+ if (zlib.m_has_dictionary )
55
+ return {}; // we dont support pre-defined dictionaries
49
56
50
- VERIFY (m_compression_method == 8 );
51
- VERIFY (m_compression_info == 7 );
52
- VERIFY (!m_has_dictionary);
53
- VERIFY ((compression_info * 256 + flags) % 31 == 0 );
57
+ if ((compression_info * 256 + flags) % 31 != 0 )
58
+ return {}; // error correction code doesnt match
54
59
55
- m_data_bytes = data.slice (2 , data.size () - 2 - 4 );
60
+ zlib.m_data_bytes = data.slice (2 , data.size () - 2 - 4 );
61
+ return zlib;
62
+ }
63
+
64
+ Zlib::Zlib (const ReadonlyBytes& data)
65
+ : m_input_data(data)
66
+ {
56
67
}
57
68
58
69
Optional<ByteBuffer> Zlib::decompress ()
@@ -62,8 +73,10 @@ Optional<ByteBuffer> Zlib::decompress()
62
73
63
74
Optional<ByteBuffer> Zlib::decompress_all (ReadonlyBytes bytes)
64
75
{
65
- Zlib zlib { bytes };
66
- return zlib.decompress ();
76
+ auto zlib = try_create (bytes);
77
+ if (!zlib.has_value ())
78
+ return {};
79
+ return zlib->decompress ();
67
80
}
68
81
69
82
u32 Zlib::checksum ()
0 commit comments