From 93a823ccb73d2941fd66a076b55bd74bba563c01 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 13 Nov 2015 15:08:43 +0100 Subject: [PATCH] fixed asan warnings --- lib/zstd_compress.c | 4 +- lib/zstd_decompress.c | 95 +++++++++++++++++++++++++++---------------- programs/fullbench.c | 9 ++-- 3 files changed, 66 insertions(+), 42 deletions(-) diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index fa720386..a128ed8c 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -751,7 +751,7 @@ size_t ZSTD_compressBlock_fast_generic(ZSTD_CCtx* ctx, if ( (match < lowest) || (MEM_read32(match) != MEM_read32(ip)) ) { ip += ((ip-anchor) >> g_searchStrength) + 1; offset_2 = offset_1; continue; } - while ((ip>anchor) && (match>base) && (ip[-1] == match[-1])) { ip--; match--; } /* catch up */ + while ((ip>anchor) && (match>lowest) && (ip[-1] == match[-1])) { ip--; match--; } /* catch up */ { size_t litLength = ip-anchor; @@ -804,7 +804,7 @@ size_t ZSTD_compressBlock_fast(ZSTD_CCtx* ctx, } -FORCE_INLINE +//FORCE_INLINE size_t ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize, diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index 9eab86b5..e195c7c1 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -488,45 +488,72 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op, /* check */ //if (match > op) return ERROR(corruption_detected); /* address space overflow test (is clang optimizer wrongly removing this test ?) */ if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */ - if (match < vBase) return ERROR(corruption_detected); - if (match < base) match = dictEnd - (base-match); /* only works if match + matchLength <= dictEnd */ + if (match < base) + { + /* offset beyond prefix */ + if (match < vBase) return ERROR(corruption_detected); + match = dictEnd - (base-match); + if (match + sequence.matchLength <= dictEnd - 8) + { + ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */ + return oMatchEnd - ostart; + } + if (match + sequence.matchLength <= dictEnd) + { + memcpy(op, match, sequence.matchLength); + return oMatchEnd - ostart; + } + /* span extDict & currentPrefixSegment */ + { + size_t length1 = dictEnd - match; + size_t length2 = sequence.matchLength - length1; + memcpy(op, match, length1); + op += length1; + memcpy(op, base, length2); /* will fail in case of overlapping match */ + return oMatchEnd - ostart; + } + } - /* close range match, overlap */ - if (sequence.offset < 8) - { - const int dec64 = dec64table[sequence.offset]; - op[0] = match[0]; - op[1] = match[1]; - op[2] = match[2]; - op[3] = match[3]; - match += dec32table[sequence.offset]; - ZSTD_copy4(op+4, match); - match -= dec64; - } - else - { - ZSTD_copy8(op, match); - } - op += 8; match += 8; + { + /* match within prefix */ + if (sequence.offset < 8) + { + /* close range match, overlap */ + const int dec64 = dec64table[sequence.offset]; + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += dec32table[sequence.offset]; + ZSTD_copy4(op+4, match); + match -= dec64; + } + else + { + ZSTD_copy8(op, match); + } + op += 8; match += 8; + + if (oMatchEnd > oend-12) + { + if (op < oend_8) + { + ZSTD_wildcopy(op, match, oend_8 - op); + match += oend_8 - op; + op = oend_8; + } + while (op < oMatchEnd) *op++ = *match++; + } + else + { + ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */ + } + return oMatchEnd - ostart; + } - if (oMatchEnd > oend-12) - { - if (op < oend_8) - { - ZSTD_wildcopy(op, match, oend_8 - op); - match += oend_8 - op; - op = oend_8; - } - while (op < oMatchEnd) *op++ = *match++; - } - else - { - ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */ - } } - return oMatchEnd - ostart; } static size_t ZSTD_decompressSequences( diff --git a/programs/fullbench.c b/programs/fullbench.c index 5471134d..5ee5d493 100644 --- a/programs/fullbench.c +++ b/programs/fullbench.c @@ -336,9 +336,7 @@ size_t benchMem(void* src, size_t srcSize, U32 benchNb) if (bp.blockType != bt_compressed) { DISPLAY("ZSTD_decodeLiteralsBlock : impossible to test on this sample (not compressible)\n"); - free(dstBuff); - free(buff2); - return 0; + goto _cleanOut; } memcpy(buff2, dstBuff+7, g_cSize-7); srcSize = srcSize > 128 KB ? 128 KB : srcSize; // relative to block @@ -356,9 +354,7 @@ size_t benchMem(void* src, size_t srcSize, U32 benchNb) if (bp.blockType != bt_compressed) { DISPLAY("ZSTD_decodeSeqHeaders : impossible to test on this sample (not compressible)\n"); - free(dstBuff); - free(buff2); - return 0; + goto _cleanOut; } iend = ip + 3 + blockSize; /* End of first block */ ip += 3; /* skip block header */ @@ -419,6 +415,7 @@ size_t benchMem(void* src, size_t srcSize, U32 benchNb) DISPLAY("%2u- %-30.30s : %7.1f MB/s (%9u)\n", benchNb, benchName, (double)srcSize / bestTime / 1000., (U32)errorCode); +_cleanOut: free(dstBuff); free(buff2); ZSTD_freeDCtx(g_dctxPtr);