From 725f7bc04c68d648abbdda7af62a0d4fc24ca848 Mon Sep 17 00:00:00 2001 From: Mika Lindqvist Date: Thu, 17 Aug 2017 21:35:15 +0300 Subject: [PATCH] Fix that s->prev is not used uninitialized in insert_string_* --- arch/aarch64/insert_string_acle.c | 8 ++++++-- arch/arm/insert_string_acle.c | 8 ++++++-- arch/x86/insert_string_sse.c | 4 +++- deflate_p.h | 4 +++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/arch/aarch64/insert_string_acle.c b/arch/aarch64/insert_string_acle.c index 985b726c..419ddff7 100644 --- a/arch/aarch64/insert_string_acle.c +++ b/arch/aarch64/insert_string_acle.c @@ -20,12 +20,13 @@ */ #ifdef ARM_ACLE_CRC_HASH Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count) { - Pos p, lp; + Pos p, lp, ret; if (unlikely(count == 0)) { return s->prev[str & s->w_mask]; } + ret = 0; lp = str + count - 1; /* last position */ for (p = str; p <= lp; p++) { @@ -43,8 +44,11 @@ Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count if (s->head[hm] != p) { s->prev[p & s->w_mask] = s->head[hm]; s->head[hm] = p; + if (p == lp) { + ret = s->prev[lp & s->w_mask]); + } } } - return s->prev[lp & s->w_mask]; + return ret; } #endif diff --git a/arch/arm/insert_string_acle.c b/arch/arm/insert_string_acle.c index 985b726c..419ddff7 100644 --- a/arch/arm/insert_string_acle.c +++ b/arch/arm/insert_string_acle.c @@ -20,12 +20,13 @@ */ #ifdef ARM_ACLE_CRC_HASH Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count) { - Pos p, lp; + Pos p, lp, ret; if (unlikely(count == 0)) { return s->prev[str & s->w_mask]; } + ret = 0; lp = str + count - 1; /* last position */ for (p = str; p <= lp; p++) { @@ -43,8 +44,11 @@ Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count if (s->head[hm] != p) { s->prev[p & s->w_mask] = s->head[hm]; s->head[hm] = p; + if (p == lp) { + ret = s->prev[lp & s->w_mask]); + } } } - return s->prev[lp & s->w_mask]; + return ret; } #endif diff --git a/arch/x86/insert_string_sse.c b/arch/x86/insert_string_sse.c index 4e303fef..8d198e97 100644 --- a/arch/x86/insert_string_sse.c +++ b/arch/x86/insert_string_sse.c @@ -42,9 +42,11 @@ ZLIB_INTERNAL Pos insert_string_sse(deflate_state *const s, const Pos str, unsig if (s->head[h & s->hash_mask] != str+idx) { s->prev[(str+idx) & s->w_mask] = s->head[h & s->hash_mask]; s->head[h & s->hash_mask] = str+idx; + if (idx == count-1) { + ret = s->prev[(str+idx) & s->w_mask]; + } } } - ret = s->prev[(str+count-1) & s->w_mask]; return ret; } #endif diff --git a/deflate_p.h b/deflate_p.h index b0d06ad8..f5e8e4cb 100644 --- a/deflate_p.h +++ b/deflate_p.h @@ -40,9 +40,11 @@ static inline Pos insert_string_c(deflate_state *const s, const Pos str, unsigne if (s->head[s->ins_h] != str+idx) { s->prev[(str+idx) & s->w_mask] = s->head[s->ins_h]; s->head[s->ins_h] = str+idx; + if (idx == count-1) { + ret = s->prev[(str+idx) & s->w_mask]; + } } } - ret = s->prev[(str+count-1) & s->w_mask]; return ret; } -- 2.47.2