struct wimlib_decompressor {
const struct decompressor_ops *ops;
+ size_t max_block_size;
void *private;
};
{
struct wimlib_decompressor *dec;
+ if (!decompressor_ctype_valid(ctype))
+ return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
+
if (dec_ret == NULL)
return WIMLIB_ERR_INVALID_PARAM;
- if (!decompressor_ctype_valid(ctype))
- return WIMLIB_ERR_INVALID_COMPRESSION_TYPE;
+ if (max_block_size == 0)
+ return WIMLIB_ERR_INVALID_PARAM;
dec = MALLOC(sizeof(*dec));
if (dec == NULL)
return WIMLIB_ERR_NOMEM;
dec->ops = decompressor_ops[ctype];
+ dec->max_block_size = max_block_size;
dec->private = NULL;
if (dec->ops->create_decompressor) {
int ret;
void *uncompressed_data, size_t uncompressed_size,
struct wimlib_decompressor *dec)
{
+ if (unlikely(uncompressed_size > dec->max_block_size))
+ return -2;
+
return dec->ops->decompress(compressed_data, compressed_size,
uncompressed_data, uncompressed_size,
dec->private);