aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/lzma
diff options
context:
space:
mode:
Diffstat (limited to 'src/liblzma/lzma')
-rw-r--r--src/liblzma/lzma/lzma_decoder.c13
-rw-r--r--src/liblzma/lzma/lzma_decoder.h10
2 files changed, 18 insertions, 5 deletions
diff --git a/src/liblzma/lzma/lzma_decoder.c b/src/liblzma/lzma/lzma_decoder.c
index dfe83589..d4cefe0b 100644
--- a/src/liblzma/lzma/lzma_decoder.c
+++ b/src/liblzma/lzma/lzma_decoder.c
@@ -547,6 +547,9 @@ decode_real(lzma_coder *restrict coder, const uint8_t *restrict in,
// Note that rep0 is known to have a safe value, thus we
// don't need to check if we are wrapping the dictionary
// when it isn't full yet.
+ if (unlikely(lz_is_empty(coder->lz)))
+ return true;
+
coder->lz.dict[coder->lz.pos]
= lz_get_byte(coder->lz, rep0);
++coder->lz.pos;
@@ -698,7 +701,6 @@ lzma_lzma_decoder_init(lzma_next_coder *next, lzma_allocator *allocator,
{
const lzma_ret ret = lzma_lz_decoder_reset(
&next->coder->lz, allocator, &decode_real,
- filters[0].uncompressed_size,
options->dictionary_size, MATCH_MAX_LEN);
if (ret != LZMA_OK) {
lzma_literal_end(&next->coder->literal_coder,
@@ -785,6 +787,15 @@ lzma_lzma_decoder_init(lzma_next_coder *next, lzma_allocator *allocator,
}
+extern void
+lzma_lzma_decoder_uncompressed_size(
+ lzma_next_coder *next, lzma_vli uncompressed_size)
+{
+ next->coder->lz.uncompressed_size = uncompressed_size;
+ return;
+}
+
+
extern bool
lzma_lzma_decode_properties(lzma_options_lzma *options, uint8_t byte)
{
diff --git a/src/liblzma/lzma/lzma_decoder.h b/src/liblzma/lzma/lzma_decoder.h
index 929c2bff..9d57c7e5 100644
--- a/src/liblzma/lzma/lzma_decoder.h
+++ b/src/liblzma/lzma/lzma_decoder.h
@@ -24,10 +24,15 @@
#include "common.h"
-/// \brief Allocates and initializes LZMA decoder
+/// Allocates and initializes LZMA decoder
extern lzma_ret lzma_lzma_decoder_init(lzma_next_coder *next,
lzma_allocator *allocator, const lzma_filter_info *filters);
+/// Set known uncompressed size. This is a hack needed to support
+/// LZMA_Alone files that don't have EOPM.
+extern void lzma_lzma_decoder_uncompressed_size(
+ lzma_next_coder *next, lzma_vli uncompressed_size);
+
/// \brief Decodes the LZMA Properties byte (lc/lp/pb)
///
/// \return true if error occorred, false on success
@@ -35,7 +40,4 @@ extern lzma_ret lzma_lzma_decoder_init(lzma_next_coder *next,
extern bool lzma_lzma_decode_properties(
lzma_options_lzma *options, uint8_t byte);
-// There is no public lzma_lzma_encode() because lzma_lz_encode() works
-// as a wrapper for it.
-
#endif