diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2017-03-30 19:47:45 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2017-03-30 19:51:14 +0300 |
commit | a0b1dda409bc3e6e2957a2651663fc411d2caf2d (patch) | |
tree | 47a3f375dbf281258bafed65b1d9c678dbffa1ba /src/liblzma/common | |
parent | liblzma: Similar memlimit fix for stream_, alone_, and auto_decoder. (diff) | |
download | xz-a0b1dda409bc3e6e2957a2651663fc411d2caf2d.tar.xz |
liblzma: Fix lzma_memlimit_set(strm, 0).
The 0 got treated specially in a buggy way and as a result
the function did nothing. The API doc said that 0 was supposed
to return LZMA_PROG_ERROR but it didn't.
Now 0 is treated as if 1 had been specified. This is done because
0 is already used to indicate an error from lzma_memlimit_get()
and lzma_memusage().
In addition, lzma_memlimit_set() no longer checks that the new
limit is at least LZMA_MEMUSAGE_BASE. It's counter-productive
for the Index decoder and was actually needed only by the
auto decoder. Auto decoder has now been modified to check for
LZMA_MEMUSAGE_BASE.
Diffstat (limited to 'src/liblzma/common')
-rw-r--r-- | src/liblzma/common/auto_decoder.c | 3 | ||||
-rw-r--r-- | src/liblzma/common/common.c | 6 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/liblzma/common/auto_decoder.c b/src/liblzma/common/auto_decoder.c index 479b150f..6895c7cc 100644 --- a/src/liblzma/common/auto_decoder.c +++ b/src/liblzma/common/auto_decoder.c @@ -139,7 +139,10 @@ auto_decoder_memconfig(void *coder_ptr, uint64_t *memusage, // the current memory usage. *memusage = LZMA_MEMUSAGE_BASE; *old_memlimit = coder->memlimit; + ret = LZMA_OK; + if (new_memlimit != 0 && new_memlimit < *memusage) + ret = LZMA_MEMLIMIT_ERROR; } if (ret == LZMA_OK && new_memlimit != 0) diff --git a/src/liblzma/common/common.c b/src/liblzma/common/common.c index 28aa2b71..57e3f8eb 100644 --- a/src/liblzma/common/common.c +++ b/src/liblzma/common/common.c @@ -435,8 +435,10 @@ lzma_memlimit_set(lzma_stream *strm, uint64_t new_memlimit) || strm->internal->next.memconfig == NULL) return LZMA_PROG_ERROR; - if (new_memlimit != 0 && new_memlimit < LZMA_MEMUSAGE_BASE) - return LZMA_MEMLIMIT_ERROR; + // Zero is a special value that cannot be used as an actual limit. + // If 0 was specified, use 1 instead. + if (new_memlimit == 0) + new_memlimit = 1; return strm->internal->next.memconfig(strm->internal->next.coder, &memusage, &old_memlimit, new_memlimit); |