From: Michihiro NAKAJIMA Date: Fri, 31 Dec 2010 11:30:20 +0000 (-0500) Subject: liblzma 5.0 provides a better solution for memory usage limit in decoding. X-Git-Tag: v3.0.0a~798 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df9c9a0cfbbedd90bf4b5d8aca76ece8504d5669;p=thirdparty%2Flibarchive.git liblzma 5.0 provides a better solution for memory usage limit in decoding. SVN-Revision: 2848 --- diff --git a/libarchive/archive_read_support_compression_xz.c b/libarchive/archive_read_support_compression_xz.c index 23f347cf4..720bc8a2c 100644 --- a/libarchive/archive_read_support_compression_xz.c +++ b/libarchive/archive_read_support_compression_xz.c @@ -69,6 +69,14 @@ struct private_data { int64_t member_out; }; +#if LZMA_VERSION_MAJOR >= 5 +/* Effectively disable the limiter. */ +#define LZMA_MEMLIMIT UINT64_MAX +#else +/* NOTE: This needs to check memory size which running system has. */ +#define LZMA_MEMLIMIT (1U << 30) +#endif + /* Combined lzip/lzma/xz filter */ static ssize_t xz_filter_read(struct archive_read_filter *, const void **); static int xz_filter_close(struct archive_read_filter *); @@ -516,18 +524,14 @@ xz_lzma_bidder_init(struct archive_read_filter *self) } else state->in_stream = 1; - /* Initialize compression library. - * TODO: I don't know what value is best for memlimit. - * maybe, it needs to check memory size which - * running system has. - */ + /* Initialize compression library. */ if (self->code == ARCHIVE_COMPRESSION_XZ) ret = lzma_stream_decoder(&(state->stream), - (1U << 30),/* memlimit */ + LZMA_MEMLIMIT,/* memlimit */ LZMA_CONCATENATED); else ret = lzma_alone_decoder(&(state->stream), - (1U << 30));/* memlimit */ + LZMA_MEMLIMIT);/* memlimit */ if (ret == LZMA_OK) return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_format_xar.c b/libarchive/archive_read_support_format_xar.c index 035e1ef07..b85a3f542 100644 --- a/libarchive/archive_read_support_format_xar.c +++ b/libarchive/archive_read_support_format_xar.c @@ -1378,6 +1378,13 @@ decompression_init(struct archive_read *a, enum enctype encoding) break; #endif #if defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA) +#if LZMA_VERSION_MAJOR >= 5 +/* Effectively disable the limiter. */ +#define LZMA_MEMLIMIT UINT64_MAX +#else +/* NOTE: This needs to check memory size which running system has. */ +#define LZMA_MEMLIMIT (1U << 30) +#endif case XZ: case LZMA: if (xar->lzstream_valid) { @@ -1386,11 +1393,11 @@ decompression_init(struct archive_read *a, enum enctype encoding) } if (xar->entry_encoding == XZ) r = lzma_stream_decoder(&(xar->lzstream), - (1U << 30),/* memlimit */ + LZMA_MEMLIMIT,/* memlimit */ LZMA_CONCATENATED); else r = lzma_alone_decoder(&(xar->lzstream), - (1U << 30));/* memlimit */ + LZMA_MEMLIMIT);/* memlimit */ if (r != LZMA_OK) { switch (r) { case LZMA_MEM_ERROR: