]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed asan warnings
authorYann Collet <yann.collet.73@gmail.com>
Fri, 13 Nov 2015 14:08:43 +0000 (15:08 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Fri, 13 Nov 2015 14:08:43 +0000 (15:08 +0100)
lib/zstd_compress.c
lib/zstd_decompress.c
programs/fullbench.c

index fa720386004522178fc6da975d08beae2167a72d..a128ed8cca0802472c7dd7965e70e9c2763f5026 100644 (file)
@@ -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,
index 9eab86b5ee3d79559b534bd1ff512585feea270e..e195c7c17b238a996eff1d8b28c6e85214192673 100644 (file)
@@ -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 */
-
-        /* 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
+               if (match < base)
         {
-            ZSTD_copy8(op, match);
-        }
-        op += 8; match += 8;
+                       /* 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;
+                       }                               
+               }
+
+               {
+                       /* 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(
index 5471134dd045bca3054deb3d69f5f5c9c9f0bd57..5ee5d493153b7129eab32bc18bced323bc33b478 100644 (file)
@@ -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);