]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
protect 32-bits mode
authorYann Collet <yann.collet.73@gmail.com>
Sat, 28 Nov 2015 15:03:22 +0000 (16:03 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Sat, 28 Nov 2015 15:03:22 +0000 (16:03 +0100)
lib/bitstream.h
lib/error.h
lib/zstd_buffered.h
lib/zstd_compress.c
lib/zstd_decompress.c
programs/Makefile
programs/paramgrill.c

index e6c2228e9eece494cecda8891f4e88deace5b1f6..dcfe8b0a47a55616b268e90fae98ad72fd51cd90 100644 (file)
@@ -208,7 +208,7 @@ MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC)
     MEM_writeLEST(bitC->ptr, bitC->bitContainer);
     bitC->ptr += nbBytes;
     bitC->bitPos &= 7;
-    bitC->bitContainer >>= nbBytes*8;
+    bitC->bitContainer >>= nbBytes*8;   /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
 }
 
 MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
@@ -218,7 +218,7 @@ MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
     bitC->ptr += nbBytes;
     if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr;
     bitC->bitPos &= 7;
-    bitC->bitContainer >>= nbBytes*8;
+    bitC->bitContainer >>= nbBytes*8;   /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
 }
 
 /*! BIT_closeCStream
index 86f3c384fc1f201a52927001dbd4690e533a7244..cfdaf5003c6be0325d39cbac32106b4075781aee 100644 (file)
@@ -68,10 +68,10 @@ extern "C" {
 
 #define ERROR_LIST(ITEM) \
         ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \
-        ITEM(PREFIX(mode_unsupported)) ITEM(PREFIX(init_missing))\
-        ITEM(PREFIX(memory_allocation)) \
+        ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(frameParameter_unsupportedBy32bitsImplementation)) \
+        ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) \
         ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \
-        ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(corruption_detected)) \
+        ITEM(PREFIX(corruption_detected)) \
         ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \
         ITEM(PREFIX(maxCode))
 
index ecbc1df567124ebc5eea9d528cbf75aab0eed273..80ba819dbee37b692c762ab2716eb25e60a1071d 100644 (file)
@@ -83,6 +83,7 @@ size_t ZBUFF_compressEnd(ZBUFF_CCtx* cctx, void* dst, size_t* maxDstSizePtr);
 *
 *  ZBUFF_compressEnd() instructs to finish a frame.
 *  It will perform a flush and write frame epilogue.
+*  Note that the epilogue is necessary for decoders to consider a frame completed.
 *  Similar to ZBUFF_compressFlush(), it may not be able to output the entire internal buffer content if *maxDstSizePtr is too small.
 *  In which case, call again ZBUFF_compressFlush() to complete the flush.
 *  @return : nb of bytes still present into internal buffer (0 if it's empty)
index 5a825b84ad7d06d790ecd65fa7f5ad43eb442d21..67c97e533cd6b4eb1940f05124c08287466c3ed9 100644 (file)
@@ -143,6 +143,7 @@ void ZSTD_validateParams(ZSTD_parameters* params)
     const U32 btPlus = (params->strategy == ZSTD_btlazy2);
 
     /* validate params */
+    if (MEM_32bits()) if (params->windowLog > 25) params->windowLog = 25;   /* 32 bits mode cannot flush > 24 bits */
     if (params->windowLog   > ZSTD_WINDOWLOG_MAX) params->windowLog = ZSTD_WINDOWLOG_MAX;
     if (params->windowLog   < ZSTD_WINDOWLOG_MIN) params->windowLog = ZSTD_WINDOWLOG_MIN;
 
@@ -153,7 +154,7 @@ void ZSTD_validateParams(ZSTD_parameters* params)
         if (params->windowLog > srcLog) params->windowLog = srcLog;
     }
 
-    if (params->windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) params->windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN;  /* required for frame header */
+    if (params->windowLog   < ZSTD_WINDOWLOG_ABSOLUTEMIN) params->windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN;  /* required for frame header */
     if (params->contentLog  > params->windowLog+btPlus) params->contentLog = params->windowLog+btPlus;   /* <= ZSTD_CONTENTLOG_MAX */
     if (params->contentLog  < ZSTD_CONTENTLOG_MIN) params->contentLog = ZSTD_CONTENTLOG_MIN;
     if (params->hashLog     > ZSTD_HASHLOG_MAX) params->hashLog = ZSTD_HASHLOG_MAX;
index 122ff2b06a41cf9b233aa295be15b082bc79a2e2..bd6cb099f32b22fdf027ccbda6a2dae54c400f5a 100644 (file)
@@ -204,8 +204,11 @@ size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcS
 *   @return : 0, or an error code, which can be tested using ZSTD_isError() */
 static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_t srcSize)
 {
+    size_t result;
     if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
-    return ZSTD_getFrameParams(&(zc->params), src, srcSize);
+    result = ZSTD_getFrameParams(&(zc->params), src, srcSize);
+    if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupportedBy32bitsImplementation);
+    return result;
 }
 
 
index de66b988ee676819333bda3a62746c4ad59413a4..9d73cb95d08e506fe930908781a9e081ae9d0741 100644 (file)
@@ -43,8 +43,8 @@ BINDIR  = $(PREFIX)/bin
 MANDIR  = $(PREFIX)/share/man/man1
 ZSTDDIR = ../lib
 
-ZSTD_FILES  = $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c
-ZSTD_LEGACY = $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c
+ZSTD_FILES := $(ZSTDDIR)/zstd_compress.c $(ZSTDDIR)/zstd_decompress.c $(ZSTDDIR)/fse.c $(ZSTDDIR)/huff0.c
+ZSTD_LEGACY:= $(ZSTDDIR)/legacy/zstd_v01.c $(ZSTDDIR)/legacy/zstd_v02.c $(ZSTDDIR)/legacy/zstd_v03.c
 
 ifeq ($(ZSTD_LEGACY),disable)
 CPPFLAGS  += -DZSTD_LEGACY_SUPPORT=0
@@ -151,83 +151,84 @@ test32: test-zstd32 test-fullbench32 test-fuzzer32 test-zbuff32
 
 test-all: test test32 valgrindTest
 
-test-zstd: zstd datagen
+zstd-playTests: datagen
        @echo "\n**** frame concatenation **** "
        @echo "hello " > hello.tmp
        @echo "world!" > world.tmp
        @cat hello.tmp world.tmp > helloworld.tmp
-       ./zstd hello.tmp > hello.zstd
-       ./zstd world.tmp > world.zstd
+       $(ZSTD) hello.tmp > hello.zstd
+       $(ZSTD) world.tmp > world.zstd
        @cat hello.zstd world.zstd > helloworld.zstd
-       ./zstd -d helloworld.zstd > result.tmp
+       $(ZSTD) -df helloworld.zstd > result.tmp
        cat result.tmp
        sdiff helloworld.tmp result.tmp
        @rm *.tmp *.zstd
        @echo frame concatenation test completed
        @echo "**** flush write error test **** "
-       echo foo | ./zstd > /dev/full; if [ $$? -eq 0 ] ; then echo "write error not detected!"; false; fi
-       echo foo | ./zstd | ./zstd -d > /dev/full; if [ $$? -eq 0 ] ; then echo "write error not detected!"; false; fi
+       echo foo | $(ZSTD) > /dev/full; if [ $$? -eq 0 ] ; then echo "write error not detected!"; false; fi
+       echo foo | $(ZSTD) | $(ZSTD) -d > /dev/full; if [ $$? -eq 0 ] ; then echo "write error not detected!"; false; fi
        @echo "**** zstd round-trip tests **** "
        @./datagen             | md5sum > tmp1
-       ./datagen              | ./zstd -v    | ./zstd -d  | md5sum > tmp2
+       ./datagen              | $(ZSTD) -v    | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen              | ./zstd -6 -v | ./zstd -d  | md5sum > tmp2
+       ./datagen              | $(ZSTD) -6 -v | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g270000000 | md5sum > tmp1
-       ./datagen -g270000000  | ./zstd -v    | ./zstd -d  | md5sum > tmp2
+       ./datagen -g270000000  | $(ZSTD) -v    | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g270000000  | ./zstd -v2   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g270000000  | $(ZSTD) -v2   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g270000000  | ./zstd -v3   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g270000000  | $(ZSTD) -v3   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g140000000 -P60| md5sum > tmp1
-       ./datagen -g140000000 -P60 | ./zstd -v4   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g140000000 -P60 | $(ZSTD) -v4   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g140000000 -P60 | ./zstd -v5   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g140000000 -P60 | $(ZSTD) -v5   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g140000000 -P60 | ./zstd -v6   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g140000000 -P60 | $(ZSTD) -v6   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g70000000 -P70 | md5sum > tmp1
-       ./datagen -g70000000 -P70  | ./zstd -v7   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g70000000 -P70  | $(ZSTD) -v7   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g70000000 -P70  | ./zstd -v8   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g70000000 -P70  | $(ZSTD) -v8   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g70000000 -P70  | ./zstd -v9   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g70000000 -P70  | $(ZSTD) -v9   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g35000000 -P75 | md5sum > tmp1
-       ./datagen -g35000000 -P75  | ./zstd -v10  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g35000000 -P75  | $(ZSTD) -v10  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g35000000 -P75  | ./zstd -v11  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g35000000 -P75  | $(ZSTD) -v11  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g35000000 -P75  | ./zstd -v12  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g35000000 -P75  | $(ZSTD) -v12  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g18000000 -P80 | md5sum > tmp1
-       ./datagen -g18000000 -P80  | ./zstd -v13  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g18000000 -P80  | $(ZSTD) -v13  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g18000000 -P80  | ./zstd -v14  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g18000000 -P80  | $(ZSTD) -v14  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g18000000 -P80  | ./zstd -v15  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g18000000 -P80  | $(ZSTD) -v15  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g18000000 -P80  | ./zstd -v16  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g18000000 -P80  | $(ZSTD) -v16  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g18000000 -P80  | ./zstd -v17  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g18000000 -P80  | $(ZSTD) -v17  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g50000000 -P94 | md5sum > tmp1
-       ./datagen -g50000000 -P94  | ./zstd -v18  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g50000000 -P94  | $(ZSTD) -v18  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
-       ./datagen -g50000000 -P94  | ./zstd -v19  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g50000000 -P94  | $(ZSTD) -v19  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        @./datagen -g99000000 -P99 | md5sum > tmp1
-       ./datagen -g99000000 -P99  | ./zstd -v20  | ./zstd -d  | md5sum > tmp2
+       ./datagen -g99000000 -P99  | $(ZSTD) -v20  | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
        ./datagen -g6000000000 -P99| md5sum > tmp1
-       ./datagen -g6000000000 -P99| ./zstd -vq   | ./zstd -d  | md5sum > tmp2
+       ./datagen -g6000000000 -P99| $(ZSTD) -vq   | $(ZSTD) -d  | md5sum > tmp2
        @diff tmp1 tmp2   
 
-test-zstd32: zstd32 datagen
-       ./datagen            | ./zstd32 -v  | ./zstd32 -d > $(VOID)
-       ./datagen -g256MB    | ./zstd32 -v  | ./zstd32 -d > $(VOID)
-       ./datagen -g6GB -P99 | ./zstd32 -vq | ./zstd32 -d > $(VOID)
+test-zstd: ZSTD = ./zstd
+test-zstd: zstd zstd-playTests
+
+test-zstd32: ZSTD = ./zstd32
+test-zstd32: zstd32 zstd-playTests
 
 test-fullbench: fullbench datagen
        ./fullbench -i1
index 62b2dcc2492423850f5e269a520f2db95bb844e6..0965a5c68cb541bddd547493927874888fee0a49 100644 (file)
@@ -1161,12 +1161,15 @@ int main(int argc, char** argv)
         if (!input_filename) { input_filename=argument; filenamesStart=i; continue; }
     }
 
-    if (optimizer)
-        result = optimizeForSize(input_filename);
-
     if (filenamesStart==0)
         result = benchSample();
-    else result = benchFiles(argv+filenamesStart, argc-filenamesStart);
+    else 
+    {
+        if (optimizer)
+            result = optimizeForSize(input_filename);
+        else
+            result = benchFiles(argv+filenamesStart, argc-filenamesStart);
+    }
 
     if (main_pause) { int unused; printf("press enter...\n"); unused = getchar(); (void)unused; }