aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/lz
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/liblzma/lz/lz_decoder.c6
-rw-r--r--src/liblzma/lz/lz_decoder.h10
-rw-r--r--src/liblzma/lzma/lzma_decoder.c13
-rw-r--r--src/liblzma/lzma/lzma_decoder.h10
4 files changed, 28 insertions, 11 deletions
diff --git a/src/liblzma/lz/lz_decoder.c b/src/liblzma/lz/lz_decoder.c
index a400bde1..ae969d62 100644
--- a/src/liblzma/lz/lz_decoder.c
+++ b/src/liblzma/lz/lz_decoder.c
@@ -387,11 +387,11 @@ lzma_lz_decoder_reset(lzma_lz_decoder *lz, lzma_allocator *allocator,
bool (*process)(lzma_coder *restrict coder,
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, bool has_safe_buffer),
- lzma_vli uncompressed_size,
size_t history_size, size_t match_max_len)
{
- // Set uncompressed size.
- lz->uncompressed_size = uncompressed_size;
+ // Known uncompressed size is used only with LZMA_Alone files so we
+ // set it always to unknown by default.
+ lz->uncompressed_size = LZMA_VLI_VALUE_UNKNOWN;
// Limit the history size to roughly sane values. This is primarily
// to prevent integer overflows.
diff --git a/src/liblzma/lz/lz_decoder.h b/src/liblzma/lz/lz_decoder.h
index a8a585cd..1acf9831 100644
--- a/src/liblzma/lz/lz_decoder.h
+++ b/src/liblzma/lz/lz_decoder.h
@@ -31,6 +31,11 @@
: (lz).dict[(lz).pos - (distance) - 1 + (lz).end])
+/// Test if dictionary is empty.
+#define lz_is_empty(lz) \
+ ((lz).pos == 0 && !(lz).is_full)
+
+
#define LZMA_LZ_DECODER_INIT \
(lzma_lz_decoder){ .dict = NULL, .size = 0, .match_max_len = 0 }
@@ -109,7 +114,6 @@ extern lzma_ret lzma_lz_decoder_reset(lzma_lz_decoder *lz,
lzma_coder *restrict coder, const uint8_t *restrict in,
size_t *restrict in_pos, size_t in_size,
bool has_safe_buffer),
- lzma_vli uncompressed_size,
size_t history_size, size_t match_max_len);
extern lzma_ret lzma_lz_decode(lzma_coder *coder, lzma_allocator *allocator,
@@ -155,12 +159,12 @@ lzma_lz_out_repeat(lzma_lz_decoder *lz, size_t distance, size_t length)
// in which e.g. the data of the previously decoded file(s)
// would be leaked (or whatever happens to be in unused
// part of the dictionary buffer).
- if (distance >= lz->pos && !lz->is_full)
+ if (unlikely(distance >= lz->pos && !lz->is_full))
return false;
// It also doesn't make sense to copy data farer than
// the dictionary size.
- if (distance >= lz->requested_size)
+ if (unlikely(distance >= lz->requested_size))
return false;
// The caller must have checked these!
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