diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2022-09-28 11:05:15 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2022-09-28 11:05:15 +0300 |
commit | 660739f99ab211edec4071de98889fb32ed04e98 (patch) | |
tree | f221ec2704f30cbdc1855ba4894772f1e0e1bfd5 /src | |
parent | liblzma: Stream decoder: Fix comments. (diff) | |
download | xz-660739f99ab211edec4071de98889fb32ed04e98.tar.xz |
liblzma: Stream decoder: Fix restarting after LZMA_MEMLIMIT_ERROR.
If lzma_code() returns LZMA_MEMLIMIT_ERROR it is now possible
to use lzma_memlimit_set() to increase the limit and continue
decoding. This was supposed to work from the beginning but
there was a bug. With other decoders (.lzma or threaded .xz)
this already worked correctly.
Diffstat (limited to 'src')
-rw-r--r-- | src/liblzma/common/stream_decoder.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/liblzma/common/stream_decoder.c b/src/liblzma/common/stream_decoder.c index 0c646052..6885d0c7 100644 --- a/src/liblzma/common/stream_decoder.c +++ b/src/liblzma/common/stream_decoder.c @@ -18,7 +18,8 @@ typedef struct { enum { SEQ_STREAM_HEADER, SEQ_BLOCK_HEADER, - SEQ_BLOCK, + SEQ_BLOCK_INIT, + SEQ_BLOCK_RUN, SEQ_INDEX, SEQ_STREAM_FOOTER, SEQ_STREAM_PADDING, @@ -185,6 +186,15 @@ stream_decode(void *coder_ptr, const lzma_allocator *allocator, return LZMA_OK; coder->pos = 0; + coder->sequence = SEQ_BLOCK_INIT; + } + + // Fall through + + case SEQ_BLOCK_INIT: { + // Checking memusage and doing the initialization needs + // its own sequence point because we need to be able to + // retry if we return LZMA_MEMLIMIT_ERROR. // Version 1 is needed to support the .ignore_check option. coder->block_options.version = 1; @@ -243,12 +253,12 @@ stream_decode(void *coder_ptr, const lzma_allocator *allocator, if (ret != LZMA_OK) return ret; - coder->sequence = SEQ_BLOCK; + coder->sequence = SEQ_BLOCK_RUN; } // Fall through - case SEQ_BLOCK: { + case SEQ_BLOCK_RUN: { const lzma_ret ret = coder->block_decoder.code( coder->block_decoder.coder, allocator, in, in_pos, in_size, out, out_pos, out_size, |