diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2008-04-24 18:38:00 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2008-04-24 18:38:00 +0300 |
commit | 712cfe3ebfd24df24d8896b1315c53c3bc4369c8 (patch) | |
tree | 941130e6e7292b6f71e487a2251d927cdb1002ce /src/liblzma/lz/match_c.h | |
parent | Fix fastpos problem in Makefile.am when built with --enable-small. (diff) | |
download | xz-712cfe3ebfd24df24d8896b1315c53c3bc4369c8.tar.xz |
Fix data corruption in LZ encoder with LZMA_SYNC_FLUSH.
Diffstat (limited to '')
-rw-r--r-- | src/liblzma/lz/match_c.h | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/liblzma/lz/match_c.h b/src/liblzma/lz/match_c.h index e1ee6a07..664db290 100644 --- a/src/liblzma/lz/match_c.h +++ b/src/liblzma/lz/match_c.h @@ -104,6 +104,14 @@ do { \ } while (0) +#define move_pending() \ +do { \ + ++lz->read_pos; \ + assert(lz->read_pos <= lz->write_pos); \ + ++lz->pending; \ +} while (0) + + ////////////////////// // Global constants // ////////////////////// @@ -123,13 +131,15 @@ LZMA_GET_MATCHES(LZMA_MATCH_FINDER_NAME_LOWER) len_limit = lz->match_max_len; } else { len_limit = lz->write_pos - lz->read_pos; - if (len_limit < MIN_MATCH_CHECK) { + if (len_limit < MIN_MATCH_CHECK || lz->sequence == SEQ_FLUSH) { distances[0] = 0; - move_pos(); + move_pending(); return; } } + assert(lz->pending == 0); + int32_t offset = 1; const uint32_t match_min_pos = lz->read_pos + lz->offset > lz->cyclic_buffer_size @@ -291,7 +301,7 @@ LZMA_SKIP(LZMA_MATCH_FINDER_NAME_LOWER) do { #ifdef IS_HASH_CHAIN if (lz->write_pos - lz->read_pos < NUM_HASH_BYTES) { - move_pos(); + move_pending(); continue; } #else @@ -300,8 +310,9 @@ LZMA_SKIP(LZMA_MATCH_FINDER_NAME_LOWER) len_limit = lz->match_max_len; } else { len_limit = lz->write_pos - lz->read_pos; - if (len_limit < MIN_MATCH_CHECK) { - move_pos(); + if (len_limit < MIN_MATCH_CHECK + || lz->sequence == SEQ_FLUSH) { + move_pending(); continue; } } @@ -311,6 +322,8 @@ LZMA_SKIP(LZMA_MATCH_FINDER_NAME_LOWER) : 0; #endif + assert(lz->pending == 0); + const uint8_t *cur = lz->buffer + lz->read_pos; #ifdef HASH_ARRAY_2 |