in csharp/src/ZStdDecompress.cs [1212:1260]
static size_t ZSTD_execSequenceLast7(BYTE* op,
BYTE* oend, seq_t sequence,
BYTE** litPtr, BYTE* litLimit,
BYTE* baseField, BYTE* vBase, BYTE* dictEnd)
{
BYTE* oLitEnd = op + sequence.litLength;
size_t sequenceLength = sequence.litLength + sequence.matchLength;
BYTE* oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
BYTE* oend_w = oend - WILDCOPY_OVERLENGTH;
BYTE* iLitEnd = *litPtr + sequence.litLength;
BYTE* match = oLitEnd - sequence.offset;
/* check */
if (oMatchEnd > oend) return ERROR(Error.dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
if (iLitEnd > litLimit) return ERROR(Error.corruption_detected); /* over-read beyond lit buffer */
if (oLitEnd <= oend_w) return ERROR(Error.GENERIC); /* Precondition */
/* copy literals */
if (op < oend_w)
{
Wildcopy(op, *litPtr, (int)(oend_w - op));
*litPtr += oend_w - op;
op = oend_w;
}
while (op < oLitEnd) *op++ = *(*litPtr)++;
/* copy Match */
if (sequence.offset > (size_t)(oLitEnd - baseField))
{
/* offset beyond prefix */
if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(Error.corruption_detected);
match = dictEnd - (baseField - match);
if (match + sequence.matchLength <= dictEnd)
{
memmove(oLitEnd, match, sequence.matchLength);
return sequenceLength;
}
/* span extDict & currentPrefixSegment */
{
size_t length1 = (size_t)(dictEnd - match);
memmove(oLitEnd, match, length1);
op = oLitEnd + length1;
sequence.matchLength -= length1;
match = baseField;
}
}
while (op < oMatchEnd) *op++ = *match++;
return sequenceLength;
}