summaryrefslogtreecommitdiffstats
path: root/lz4.c
diff options
context:
space:
mode:
authoryann.collet.73@gmail.com <yann.collet.73@gmail.com@650e7d94-2a16-8b24-b05c-7c0b3f6821cd>2013-11-02 12:11:04 (GMT)
committeryann.collet.73@gmail.com <yann.collet.73@gmail.com@650e7d94-2a16-8b24-b05c-7c0b3f6821cd>2013-11-02 12:11:04 (GMT)
commit7a863abfc2da21cf69fc2db2ad92e9f8e2c72004 (patch)
tree39eb82e5f1d1874e1efd9f748d856f489670678d /lz4.c
parenta78db582d321446b5167de67eec8ba3239b14bbe (diff)
downloadlz4-7a863abfc2da21cf69fc2db2ad92e9f8e2c72004.zip
lz4-7a863abfc2da21cf69fc2db2ad92e9f8e2c72004.tar.gz
lz4-7a863abfc2da21cf69fc2db2ad92e9f8e2c72004.tar.bz2
lz4.c : corrected compression efficiency issue 97 in 64-bits chained mode (-BD) for streams > 4 GB (thanks Roman Strashkin for reporting)
git-svn-id: https://lz4.googlecode.com/svn/trunk@108 650e7d94-2a16-8b24-b05c-7c0b3f6821cd
Diffstat (limited to 'lz4.c')
-rw-r--r--lz4.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/lz4.c b/lz4.c
index 2d014ca..5668521 100644
--- a/lz4.c
+++ b/lz4.c
@@ -631,21 +631,27 @@ char* LZ4_slideInputBuffer (void* LZ4_Data)
LZ4_Data_Structure* lz4ds = (LZ4_Data_Structure*)LZ4_Data;
size_t delta = lz4ds->nextBlock - (lz4ds->bufferStart + 64 KB);
- if(lz4ds->base - delta > lz4ds->base) // underflow control
+ if ( (lz4ds->base - delta > lz4ds->base) // underflow control
+ || ((size_t)(lz4ds->nextBlock - lz4ds->base) > 0xE0000000) ) // close to 32-bits limit
{
- size_t newBaseDelta = (lz4ds->nextBlock - 64 KB) - lz4ds->base;
+ size_t deltaLimit = (lz4ds->nextBlock - 64 KB) - lz4ds->base;
int nH;
for (nH=0; nH < HASHNBCELLS4; nH++)
{
- if (lz4ds->hashTable[nH] < (U32)newBaseDelta) lz4ds->hashTable[nH] = 0;
- else lz4ds->hashTable[nH] -= (U32)newBaseDelta;
+ if ((size_t)(lz4ds->hashTable[nH]) < deltaLimit) lz4ds->hashTable[nH] = 0;
+ else lz4ds->hashTable[nH] -= (U32)deltaLimit;
}
- lz4ds->base += newBaseDelta;
+ memcpy((void*)(lz4ds->bufferStart), (const void*)(lz4ds->nextBlock - 64 KB), 64 KB);
+ lz4ds->base = lz4ds->bufferStart;
+ lz4ds->nextBlock = lz4ds->base + 64 KB;
}
- memcpy((void*)(lz4ds->bufferStart), (const void*)(lz4ds->nextBlock - 64 KB), 64 KB);
- lz4ds->nextBlock -= delta;
- lz4ds->base -= delta;
+ else
+ {
+ memcpy((void*)(lz4ds->bufferStart), (const void*)(lz4ds->nextBlock - 64 KB), 64 KB);
+ lz4ds->nextBlock -= delta;
+ lz4ds->base -= delta;
+ }
return (char*)(lz4ds->nextBlock);
}