lz4hc.c: change (length >> 8) to (length / 255)
Every 0xff byte in the compressed block corresponds to a length of 255 (not 256) in the input data. For long repeating sequences, using (length >> 8) may generate bad compressed blocks.
This commit is contained in:
parent
ec735ac53e
commit
660d21272e
@ -437,7 +437,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
|
|||||||
|
|
||||||
/* Encode Literal length */
|
/* Encode Literal length */
|
||||||
length = (size_t)(*ip - *anchor);
|
length = (size_t)(*ip - *anchor);
|
||||||
if ((limit) && ((*op + (length >> 8) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */
|
if ((limit) && ((*op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */
|
||||||
if (length >= RUN_MASK) {
|
if (length >= RUN_MASK) {
|
||||||
size_t len = length - RUN_MASK;
|
size_t len = length - RUN_MASK;
|
||||||
*token = (RUN_MASK << ML_BITS);
|
*token = (RUN_MASK << ML_BITS);
|
||||||
@ -458,7 +458,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
|
|||||||
/* Encode MatchLength */
|
/* Encode MatchLength */
|
||||||
assert(matchLength >= MINMATCH);
|
assert(matchLength >= MINMATCH);
|
||||||
length = (size_t)(matchLength - MINMATCH);
|
length = (size_t)(matchLength - MINMATCH);
|
||||||
if ((limit) && (*op + (length >> 8) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */
|
if ((limit) && (*op + (length / 255) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */
|
||||||
if (length >= ML_MASK) {
|
if (length >= ML_MASK) {
|
||||||
*token += ML_MASK;
|
*token += ML_MASK;
|
||||||
length -= ML_MASK;
|
length -= ML_MASK;
|
||||||
|
Loading…
Reference in New Issue
Block a user