Merge pull request #478 from terrelln/wildcopy-ub
Fix execSequence wildcopy undefined behavior
This commit is contained in:
@@ -147,7 +147,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
/*! ZSTD_wildcopy() :
|
/*! ZSTD_wildcopy() :
|
||||||
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
||||||
#define WILDCOPY_OVERLENGTH 8
|
#define WILDCOPY_OVERLENGTH 8
|
||||||
MEM_STATIC void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
MEM_STATIC void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
|
|||||||
@@ -997,7 +997,7 @@ size_t ZSTD_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
while (op < oMatchEnd) *op++ = *match++;
|
while (op < oMatchEnd) *op++ = *match++;
|
||||||
} else {
|
} else {
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
@@ -1218,7 +1218,7 @@ size_t ZSTD_execSequenceLong(BYTE* op,
|
|||||||
}
|
}
|
||||||
while (op < oMatchEnd) *op++ = *match++;
|
while (op < oMatchEnd) *op++ = *match++;
|
||||||
} else {
|
} else {
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1354,7 +1354,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
|
|
||||||
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
||||||
|
|
||||||
static void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -1814,7 +1814,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|||||||
while (op<endMatch) *op++ = *match++;
|
while (op<endMatch) *op++ = *match++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
|
|
||||||
/* restore, in case of overlap */
|
/* restore, in case of overlap */
|
||||||
if (overlapRisk) memcpy(endMatch, saved, qutt);
|
if (overlapRisk) memcpy(endMatch, saved, qutt);
|
||||||
|
|||||||
@@ -2808,7 +2808,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
||||||
|
|
||||||
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
||||||
static void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -3218,7 +3218,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2449,7 +2449,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
||||||
|
|
||||||
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
||||||
static void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -2859,7 +2859,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
||||||
|
|
||||||
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
|
||||||
static void ZSTD_wildcopy(void* dst, const void* src, size_t length)
|
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -3146,7 +3146,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ static void ZSTDv05_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
|
|
||||||
/*! ZSTDv05_wildcopy() :
|
/*! ZSTDv05_wildcopy() :
|
||||||
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
||||||
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src, size_t length)
|
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -3357,7 +3357,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|||||||
while (op < oMatchEnd)
|
while (op < oMatchEnd)
|
||||||
*op++ = *match++;
|
*op++ = *match++;
|
||||||
} else {
|
} else {
|
||||||
ZSTDv05_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTDv05_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -537,7 +537,7 @@ static void ZSTDv06_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
/*! ZSTDv06_wildcopy() :
|
/*! ZSTDv06_wildcopy() :
|
||||||
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
||||||
#define WILDCOPY_OVERLENGTH 8
|
#define WILDCOPY_OVERLENGTH 8
|
||||||
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, size_t length)
|
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -3503,7 +3503,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
while (op < oMatchEnd) *op++ = *match++;
|
while (op < oMatchEnd) *op++ = *match++;
|
||||||
} else {
|
} else {
|
||||||
ZSTDv06_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTDv06_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2845,7 +2845,7 @@ static void ZSTDv07_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|||||||
/*! ZSTDv07_wildcopy() :
|
/*! ZSTDv07_wildcopy() :
|
||||||
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
||||||
#define WILDCOPY_OVERLENGTH 8
|
#define WILDCOPY_OVERLENGTH 8
|
||||||
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src, size_t length)
|
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
BYTE* op = (BYTE*)dst;
|
BYTE* op = (BYTE*)dst;
|
||||||
@@ -3726,7 +3726,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|||||||
}
|
}
|
||||||
while (op < oMatchEnd) *op++ = *match++;
|
while (op < oMatchEnd) *op++ = *match++;
|
||||||
} else {
|
} else {
|
||||||
ZSTDv07_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTDv07_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
return sequenceLength;
|
return sequenceLength;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user