aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/common
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2022-09-28 11:05:15 +0300
committerLasse Collin <lasse.collin@tukaani.org>2022-09-28 11:05:15 +0300
commit660739f99ab211edec4071de98889fb32ed04e98 (patch)
treef221ec2704f30cbdc1855ba4894772f1e0e1bfd5 /src/liblzma/common
parentliblzma: Stream decoder: Fix comments. (diff)
downloadxz-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/liblzma/common')
-rw-r--r--src/liblzma/common/stream_decoder.c16
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,