3434
3535#include "deps/zx/zx7/zx7.h"
3636#include "deps/zx/zx0/zx0.h"
37- #include "deps/lz4/lib/lz4frame.h"
38- #include "deps/lz4/lib/lz4hc.h"
37+ #include "deps/lz4/lib/lz4.h"
3938
4039#include <string.h>
4140
41+ #define LZ4_SIZE_PREFIX_BYTES 3
42+
4243static uint8_t * compress_zx7 (void * data , size_t * size )
4344{
4445 uint8_t * compressed_data ;
@@ -102,9 +103,10 @@ static uint8_t *compress_lz4(void *data, size_t *size)
102103 uint8_t * compressed_data ;
103104 const char * input ;
104105 size_t orig_size ;
105- size_t max_compressed_size ;
106- size_t compressed_size ;
107- LZ4F_preferences_t preferences = LZ4F_INIT_PREFERENCES ;
106+ int input_size ;
107+ int max_compressed_size ;
108+ int compressed_size ;
109+ size_t total_size ;
108110
109111 if (size == NULL || data == NULL )
110112 {
@@ -114,30 +116,45 @@ static uint8_t *compress_lz4(void *data, size_t *size)
114116 input = data ;
115117 orig_size = * size ;
116118
117- preferences .compressionLevel = LZ4HC_CLEVEL_MAX ;
118- preferences .frameInfo .contentChecksumFlag = LZ4F_noContentChecksum ;
119+ if (orig_size > LZ4_MAX_INPUT_SIZE )
120+ {
121+ LOG_ERROR ("LZ4 compression failed: input too large.\n" );
122+ return NULL ;
123+ }
119124
120- max_compressed_size = LZ4F_compressFrameBound (orig_size , & preferences );
121- compressed_data = memory_alloc (max_compressed_size );
125+ input_size = (int )orig_size ;
126+ max_compressed_size = LZ4_compressBound (input_size );
127+ compressed_data = memory_alloc ((size_t )max_compressed_size + LZ4_SIZE_PREFIX_BYTES );
122128 if (compressed_data == NULL )
123129 {
124130 return NULL ;
125131 }
126132
127- compressed_size = LZ4F_compressFrame ( compressed_data , max_compressed_size ,
128- input , orig_size , & preferences );
129-
130- if (LZ4F_isError ( compressed_size ) )
133+ compressed_size = LZ4_compress_default ( input , ( char * )( compressed_data + LZ4_SIZE_PREFIX_BYTES ),
134+ input_size , max_compressed_size );
135+
136+ if (compressed_size <= 0 )
131137 {
132138 free (compressed_data );
133- LOG_ERROR ("LZ4 frame compression failed: %s\n" ,
134- LZ4F_getErrorName (compressed_size ));
139+ LOG_ERROR ("LZ4 block compression failed.\n" );
135140 return NULL ;
136141 }
137142
138- LOG_DEBUG ("Compressed size: %zu -> %zu\n" , orig_size , compressed_size );
143+ if (compressed_size > 0xFFFFFF )
144+ {
145+ free (compressed_data );
146+ LOG_ERROR ("LZ4 compression failed: output too large for 3-byte size.\n" );
147+ return NULL ;
148+ }
139149
140- * size = compressed_size ;
150+ compressed_data [0 ] = (uint8_t )(compressed_size & 0xFF );
151+ compressed_data [1 ] = (uint8_t )((compressed_size >> 8 ) & 0xFF );
152+ compressed_data [2 ] = (uint8_t )((compressed_size >> 16 ) & 0xFF );
153+
154+ total_size = (size_t )compressed_size + LZ4_SIZE_PREFIX_BYTES ;
155+ LOG_DEBUG ("Compressed size: %zu -> %zu (lz4 block)\n" , orig_size , total_size );
156+
157+ * size = total_size ;
141158
142159 return compressed_data ;
143160}
0 commit comments