]> wimlib.net Git - wimlib/commitdiff
Revert "lzx-compress.c: Simplify calculation of position footer"
authorEric Biggers <ebiggers3@gmail.com>
Sat, 31 May 2014 00:34:34 +0000 (19:34 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Sat, 31 May 2014 00:38:32 +0000 (19:38 -0500)
This reverts commit 3adc1ac1ebe221427857d8f6fd06cfb823b4bea6.

If the position footer is unconditionally calculated as the match offset
minus the position base value, the (ultimately unused) position footer
for repeat matches can overflow the number of bits in which it is stored
in the intermediate representation used by this implementation.  For now,
use the old version, which would set the position footers of repeat
matches to 0.

src/lzx-compress.c

index 5246e1a1ed3b7add7f7c543c0a240177c3c1218e..360ee9c4e49a528da6b90fe6b26a4249f2ef3998 100644 (file)
@@ -958,8 +958,8 @@ lzx_tally_match(unsigned match_len, unsigned match_offset,
        /* The match offset shall be encoded as a position slot (itself encoded
         * as part of the main symbol) and a position footer.  */
        position_slot = lzx_get_position_slot(match_offset, queue);
        /* The match offset shall be encoded as a position slot (itself encoded
         * as part of the main symbol) and a position footer.  */
        position_slot = lzx_get_position_slot(match_offset, queue);
-       position_footer = (match_offset + LZX_OFFSET_OFFSET) -
-                               lzx_position_base[position_slot];
+       position_footer = (match_offset + LZX_OFFSET_OFFSET) &
+                               ((1U << lzx_get_num_extra_bits(position_slot)) - 1);
 
        /* The match length shall be encoded as a length header (itself encoded
         * as part of the main symbol) and an optional length footer.  */
 
        /* The match length shall be encoded as a length header (itself encoded
         * as part of the main symbol) and an optional length footer.  */