From 064a143520ded4d8410c63220fa9b3630a40c503 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Mon, 12 Dec 2016 19:01:23 -0800 Subject: [PATCH] Fix execSequence wildcopy undefined behavior execSequence relied on pointer overflow to handle cases where `sequence.matchLength < 8`. Instead of passing an `size_t` to wildcopy, pass a `ptrdiff_t`. --- lib/common/zstd_internal.h | 2 +- lib/decompress/zstd_decompress.c | 4 ++-- lib/legacy/zstd_v01.c | 4 ++-- lib/legacy/zstd_v02.c | 4 ++-- lib/legacy/zstd_v03.c | 4 ++-- lib/legacy/zstd_v04.c | 4 ++-- lib/legacy/zstd_v05.c | 4 ++-- lib/legacy/zstd_v06.c | 4 ++-- lib/legacy/zstd_v07.c | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index a5002fb11..96e057758 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -147,7 +147,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); } /*! ZSTD_wildcopy() : * custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */ #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; BYTE* op = (BYTE*)dst; diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 70dd4ccaa..ce91c0aff 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -997,7 +997,7 @@ size_t ZSTD_execSequence(BYTE* op, } while (op < oMatchEnd) *op++ = *match++; } 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; } @@ -1218,7 +1218,7 @@ size_t ZSTD_execSequenceLong(BYTE* op, } while (op < oMatchEnd) *op++ = *match++; } 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; } diff --git a/lib/legacy/zstd_v01.c b/lib/legacy/zstd_v01.c index 5c36c2108..376aefe2d 100644 --- a/lib/legacy/zstd_v01.c +++ b/lib/legacy/zstd_v01.c @@ -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; } -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; BYTE* op = (BYTE*)dst; @@ -1814,7 +1814,7 @@ static size_t ZSTD_execSequence(BYTE* op, while (op