]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
copy fix for v0.3 to v0.4
authorYann Collet <cyan@fb.com>
Tue, 7 Feb 2023 04:36:37 +0000 (20:36 -0800)
committerYann Collet <yann.collet.73@gmail.com>
Tue, 7 Feb 2023 21:55:30 +0000 (13:55 -0800)
in case it would be applicable for this legacy version too.

lib/legacy/zstd_v03.c
lib/legacy/zstd_v04.c

index d247d5d55a7b43bbaa45930e9a70a3d7e2079387..b0d7f521ed05682eb09082d2bd537fcc2b91eccc 100644 (file)
@@ -2710,7 +2710,7 @@ static size_t ZSTD_execSequence(BYTE* op,
 
     if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
     if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
-    /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */
+    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
     if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);
     if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
 
index 23735443a8881c4eea21bdeb16fa7c807d01c8fc..f820134b7cbe74edc576bc1af2b9d62c3cc81002 100644 (file)
@@ -2828,13 +2828,20 @@ static size_t ZSTD_execSequence(BYTE* op,
     const BYTE* const litEnd = *litPtr + sequence.litLength;
     const BYTE* match = oLitEnd - sequence.offset;
 
-    /* check */
-    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);   /* last match must start at a minimum distance of 8 from oend */
+    /* checks */
+    size_t const seqLength = sequence.litLength + sequence.matchLength;
+
+    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
+    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
+    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
+    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);
+    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
+
     if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */
-    if (litEnd > litLimit) return ERROR(corruption_detected);   /* risk read beyond lit buffer */
+    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */
 
     /* copy Literals */
-    ZSTD_wildcopy(op, *litPtr, sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
+    ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
     op = oLitEnd;
     *litPtr = litEnd;   /* update for next sequence */