From ff795580f2e9acb02d1a68b9e2f1d4a17a4e3343 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 10 Jan 2018 20:33:45 -0800 Subject: [PATCH 1/2] fixed bug #976, reported by @indygreg constants in zstd.h should not depend on MIN() macro which existence is not guaranteed. Added a test to check the specific constants. The test is a bit too specific. But I have found no way to control a more generic "are all macro already defined" condition, especially as this is a valid construction (the missing macro might be defined later, intentionnally). --- lib/zstd.h | 4 ++-- tests/fuzzer.c | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index c19496d02..a84490d99 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -379,9 +379,9 @@ ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output #define ZSTD_WINDOWLOG_MAX_64 31 #define ZSTD_WINDOWLOG_MAX ((unsigned)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) #define ZSTD_WINDOWLOG_MIN 10 -#define ZSTD_HASHLOG_MAX MIN(ZSTD_WINDOWLOG_MAX, 30) +#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) #define ZSTD_HASHLOG_MIN 6 -#define ZSTD_CHAINLOG_MAX MIN(ZSTD_WINDOWLOG_MAX+1, 30) +#define ZSTD_CHAINLOG_MAX ((ZSTD_WINDOWLOG_MAX < 29) ? ZSTD_WINDOWLOG_MAX+1 : 30) #define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN #define ZSTD_HASHLOG3_MAX 17 #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 141bf6548..13e856be0 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -65,11 +65,18 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; { g_displayClock = UTIL_getTime(); DISPLAY(__VA_ARGS__); \ if (g_displayLevel>=4) fflush(stderr); } } -/*-******************************************************* -* Fuzzer functions -*********************************************************/ + #undef MIN #undef MAX +void FUZ_bug976() +{ /* these constants shall not depend on MIN() macro */ + assert(ZSTD_HASHLOG_MAX < 31); + assert(ZSTD_CHAINLOG_MAX < 31); +} + +/*-******************************************************* +* Internal functions +*********************************************************/ #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) From 2103a62b3d4b7c092021d7c21c0d2db7ad760841 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 11 Jan 2018 04:49:19 -0800 Subject: [PATCH 2/2] fixed minor warning on prototype definition --- tests/fuzzer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 13e856be0..e0817e903 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -68,7 +68,7 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; #undef MIN #undef MAX -void FUZ_bug976() +void FUZ_bug976(void) { /* these constants shall not depend on MIN() macro */ assert(ZSTD_HASHLOG_MAX < 31); assert(ZSTD_CHAINLOG_MAX < 31);