diff -Naru xz-5.2.3/src/liblzma/lz/lz_encoder_mf.c xz-5.2.3.tpg/src/liblzma/lz/lz_encoder_mf.c --- xz-5.2.3/src/liblzma/lz/lz_encoder_mf.c 2016-12-30 11:08:20.000000000 +0000 +++ xz-5.2.3.tpg/src/liblzma/lz/lz_encoder_mf.c 2017-10-23 15:45:34.970539050 +0000 @@ -464,22 +464,22 @@ uint32_t len0 = 0; uint32_t len1 = 0; + uint32_t len2 = 0; while (true) { const uint32_t delta = pos - cur_match; + uint32_t len = len2; if (depth-- == 0 || delta >= cyclic_size) { *ptr0 = EMPTY_HASH_VALUE; *ptr1 = EMPTY_HASH_VALUE; return matches; } + const uint8_t *const pb = cur - delta; uint32_t *const pair = son + ((cyclic_pos - delta + (delta > cyclic_pos ? cyclic_size : 0)) << 1); - const uint8_t *const pb = cur - delta; - uint32_t len = my_min(len0, len1); - if (pb[len] == cur[len]) { len = lzma_memcmplen(pb, cur, len + 1, len_limit); @@ -502,11 +502,13 @@ ptr1 = pair + 1; cur_match = *ptr1; len1 = len; + len2 = my_min(len0, len1); } else { *ptr0 = cur_match; ptr0 = pair; cur_match = *ptr0; len0 = len; + len2 = my_min(len0, len1); } } }