]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
added ZSTD_error_frameParameter_windowTooLarge (#403)
authorYann Collet <cyan@fb.com>
Thu, 13 Oct 2016 00:28:59 +0000 (17:28 -0700)
committerYann Collet <cyan@fb.com>
Thu, 13 Oct 2016 00:29:24 +0000 (17:29 -0700)
lib/common/error_private.c
lib/common/zstd_errors.h
lib/decompress/zstd_decompress.c

index 839f77434689a300ddcad1da930ac7d949a4dc01..a0fa1724aee8b823ff8395aa86cfb811024c85d1 100644 (file)
@@ -23,6 +23,7 @@ const char* ERR_getErrorString(ERR_enum code)
     case PREFIX(parameter_unknown): return "Unknown parameter type";
     case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
     case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode";
+    case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding";
     case PREFIX(compressionParameter_unsupported): return "Compression parameter is out of bound";
     case PREFIX(init_missing): return "Context should be init first";
     case PREFIX(memory_allocation): return "Allocation error : not enough memory";
index 9335eaab0eb60d4046e0045bfef0f3f44d610a88..50dc4f720f41e9df5ab1552872b4f42357c6b4ef 100644 (file)
@@ -29,6 +29,7 @@ typedef enum {
   ZSTD_error_parameter_unknown,
   ZSTD_error_frameParameter_unsupported,
   ZSTD_error_frameParameter_unsupportedBy32bits,
+  ZSTD_error_frameParameter_windowTooLarge,
   ZSTD_error_compressionParameter_unsupported,
   ZSTD_error_init_missing,
   ZSTD_error_memory_allocation,
index 88869d82a0092b6e50f838a12b6e6b85c2d0acb1..d157e0051800ca94b32616e5c82e9a7d1c98ec16 100644 (file)
@@ -248,7 +248,7 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
         if (!singleSegment) {
             BYTE const wlByte = ip[pos++];
             U32 const windowLog = (wlByte >> 3) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
-            if (windowLog > ZSTD_WINDOWLOG_MAX) return ERROR(frameParameter_unsupported);
+            if (windowLog > ZSTD_WINDOWLOG_MAX) return ERROR(frameParameter_windowTooLarge);  /* avoids issue with 1 << windowLog */
             windowSize = (1U << windowLog);
             windowSize += (windowSize >> 3) * (wlByte&7);
         }
@@ -270,7 +270,7 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
             case 3 : frameContentSize = MEM_readLE64(ip+pos); break;
         }
         if (!windowSize) windowSize = (U32)frameContentSize;
-        if (windowSize > windowSizeMax) return ERROR(frameParameter_unsupported);
+        if (windowSize > windowSizeMax) return ERROR(frameParameter_windowTooLarge);
         fparamsPtr->frameContentSize = frameContentSize;
         fparamsPtr->windowSize = windowSize;
         fparamsPtr->dictID = dictID;