From: Carl Woffenden Date: Tue, 7 Apr 2020 09:13:02 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/dev' into single-file-lib X-Git-Tag: v1.4.5^2~66^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7af7735fa38aab617514c59856608b7ff4a3a4e2;p=thirdparty%2Fzstd.git Merge remote-tracking branch 'upstream/dev' into single-file-lib --- 7af7735fa38aab617514c59856608b7ff4a3a4e2 diff --cc lib/common/zstd_internal.h index 899883bc3,099a98e77..2103ef859 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@@ -248,15 -248,17 +248,26 @@@ void ZSTD_wildcopy(void* dst, const voi } } +MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize) +{ + size_t const length = MIN(dstCapacity, srcSize); + if (length > 0) { + memcpy(dst, src, length); + } + return length; +} + + /* define "workspace is too large" as this number of times larger than needed */ + #define ZSTD_WORKSPACETOOLARGE_FACTOR 3 + + /* when workspace is continuously too large + * during at least this number of times, + * context's memory usage is considered wasteful, + * because it's sized to handle a worst case scenario which rarely happens. + * In which case, resize it down to free some memory */ + #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 + + /*-******************************************* * Private declarations *********************************************/ diff --cc lib/decompress/zstd_decompress.c index ac93ed0bf,754723042..a7fcd57fe --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@@ -1498,6 -1499,33 +1499,25 @@@ size_t ZSTD_estimateDStreamSize_fromFra /* ***** Decompression ***** */ -MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize) -{ - size_t const length = MIN(dstCapacity, srcSize); - if (length > 0) { - memcpy(dst, src, length); - } - return length; -} + + static int ZSTD_DCtx_isOverflow(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) + { + return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_WORKSPACETOOLARGE_FACTOR; + } + + static void ZSTD_DCtx_updateOversizedDuration(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize) + { + if (ZSTD_DCtx_isOverflow(zds, neededInBuffSize, neededOutBuffSize)) + zds->oversizedDuration++; + else + zds->oversizedDuration = 0; + } + + static int ZSTD_DCtx_isOversizedTooLong(ZSTD_DStream* zds) + { + return zds->oversizedDuration >= ZSTD_WORKSPACETOOLARGE_MAXDURATION; + } + size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input) { const char* const src = (const char*)input->src;