X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdecompress.c;h=b8ed8dfcfe03186b33a119c4069e31d2709f5bca;hb=f217a34cf5fecfd91b10395f9165a7ae9570c4aa;hp=3bd51b183b5de90f1c20ea7a5630a03254e9533a;hpb=cbd31ea4e13a4e7479b2a19dc59efd9f2dd86e5e;p=wimlib diff --git a/src/decompress.c b/src/decompress.c index 3bd51b18..b8ed8dfc 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2013 Eric Biggers + * Copyright (C) 2013, 2014 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * @@ -34,19 +34,16 @@ struct wimlib_decompressor { const struct decompressor_ops *ops; + size_t max_block_size; void *private; }; static const struct decompressor_ops *decompressor_ops[] = { - [WIMLIB_COMPRESSION_TYPE_LZX] = &lzx_decompressor_ops, [WIMLIB_COMPRESSION_TYPE_XPRESS] = &xpress_decompressor_ops, + [WIMLIB_COMPRESSION_TYPE_LZX] = &lzx_decompressor_ops, [WIMLIB_COMPRESSION_TYPE_LZMS] = &lzms_decompressor_ops, }; -static struct wimlib_decompressor_params_header * -decompressor_default_params[ARRAY_LEN(decompressor_ops)] = { -}; - static bool decompressor_ctype_valid(int ctype) { @@ -55,65 +52,32 @@ decompressor_ctype_valid(int ctype) decompressor_ops[ctype] != NULL); } -WIMLIBAPI int -wimlib_set_default_decompressor_params(enum wimlib_compression_type ctype, - const struct wimlib_decompressor_params_header *params) -{ - struct wimlib_decompressor_params_header *dup; - - if (!decompressor_ctype_valid(ctype)) - return WIMLIB_ERR_INVALID_COMPRESSION_TYPE; - - dup = NULL; - if (params) { - dup = memdup(params, params->size); - if (dup == NULL) - return WIMLIB_ERR_NOMEM; - } - - FREE(decompressor_default_params[ctype]); - decompressor_default_params[ctype] = dup; - return 0; -} - -void -cleanup_decompressor_params(void) -{ - for (size_t i = 0; i < ARRAY_LEN(decompressor_default_params); i++) { - FREE(decompressor_default_params[i]); - decompressor_default_params[i] = NULL; - } -} - WIMLIBAPI int wimlib_create_decompressor(enum wimlib_compression_type ctype, size_t max_block_size, - const struct wimlib_decompressor_params_header *extra_params, struct wimlib_decompressor **dec_ret) { 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) { - const struct wimlib_decompressor_params_header *params; int ret; - if (extra_params) - params = extra_params; - else - params = decompressor_default_params[ctype]; ret = dec->ops->create_decompressor(max_block_size, - params, &dec->private); if (ret) { FREE(dec); @@ -129,6 +93,9 @@ wimlib_decompress(const void *compressed_data, size_t compressed_size, 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);