<pre style='margin:0'>
Blair Zajac (blair) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/1202fabf62f7a91e967260679451fd68d13b4853">https://github.com/macports/macports-ports/commit/1202fabf62f7a91e967260679451fd68d13b4853</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 1202fabf62f zstd: add upstream patch for rare corruption-bug
</span>1202fabf62f is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 1202fabf62f7a91e967260679451fd68d13b4853
</span>Author: Blair Zajac <blairzajac@google.com>
AuthorDate: Wed Mar 22 16:24:32 2023 -0700

<span style='display:block; white-space:pre;color:#404040;'>    zstd: add upstream patch for rare corruption-bug
</span>---
 archivers/zstd/Portfile                            |   3 +-
 .../zstd/files/patch-zstd-rare-corruption-bug.diff | 117 +++++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/archivers/zstd/Portfile b/archivers/zstd/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 07cdce1c6d4..79ebc98bdd1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/archivers/zstd/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/archivers/zstd/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,7 +7,7 @@ PortGroup           makefile 1.0
</span> PortGroup           muniversal 1.0
 
 github.setup        facebook zstd 1.5.4 v
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            1
</span> 
 checksums           rmd160  8903b14d757e2fa8375421402920a89b50cdf03f \
                     sha256  0f470992aedad543126d06efab344dc5f3e171893810455787d38347343a4424 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -34,6 +34,7 @@ depends_lib-append  port:lz4 \
</span> license_noconflict  lz4 xz zlib
 
 patchfiles          patch-zstd-tiger-no-backtrace.diff \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-zstd-rare-corruption-bug.diff \
</span>                     flags.patch
 
 platform darwin 8 {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/archivers/zstd/files/patch-zstd-rare-corruption-bug.diff b/archivers/zstd/files/patch-zstd-rare-corruption-bug.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..77ea31a43e4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/archivers/zstd/files/patch-zstd-rare-corruption-bug.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,117 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+https://github.com/facebook/zstd/commit/395a2c54621d36b4eaf17b4111353243f91a1d90
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git lib/compress/zstd_compress.c lib/compress/zstd_compress.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 173ce242..e04d207e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- lib/compress/zstd_compress.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ lib/compress/zstd_compress.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3859,9 +3859,10 @@ ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         const seqStore_t* const seqStore, U32 const nbSeq)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     U32 idx = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    U32 const longLitLenIdx = seqStore->longLengthType == ZSTD_llt_literalLength ? seqStore->longLengthPos : nbSeq;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (; idx < nbSeq; ++idx) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         seqDef* const seq = seqStore->sequencesStart + idx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        U32 const ll0 = (seq->litLength == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        U32 const ll0 = (seq->litLength == 0) && (idx != longLitLenIdx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         U32 const offBase = seq->offBase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         assert(offBase > 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (OFFBASE_IS_REPCODE(offBase)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/cli-tests/compression/golden.sh tests/cli-tests/compression/golden.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 85dd3fdb..458be9d4 100755
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tests/cli-tests/compression/golden.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tests/cli-tests/compression/golden.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -10,3 +10,7 @@ zstd -r -t golden-compressed/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zstd --target-compressed-block-size=1024 -rf golden/ --output-dir-mirror golden-compressed/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ zstd -r -t golden-compressed/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# PR #3517 block splitter corruption test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++zstd -rf -19 --zstd=mml=7 golden/ --output-dir-mirror golden-compressed/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++zstd -r -t golden-compressed/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/fuzzer.c tests/fuzzer.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fc78c7fb..85fa3847 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tests/fuzzer.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tests/fuzzer.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1286,6 +1286,73 @@ static int basicUnitTests(U32 const seed, double compressibility)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DISPLAYLEVEL(3, "OK \n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DISPLAYLEVEL(3, "test%3i : Check block splitter with 64K literal length : ", testNb++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {   ZSTD_CCtx* cctx = ZSTD_createCCtx();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        size_t const srcSize = 256 * 1024;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        U32 const compressibleLenU32 = 32 * 1024 / 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        U32 const blockSizeU32 = 128 * 1024 / 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        U32 const litLenU32 = 64 * 1024 / 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        U32* data = (U32*)malloc(srcSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        size_t dSize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (data == NULL || cctx == NULL) goto _output_error;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Generate data without any matches */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        RDG_genBuffer(data, srcSize, 0.0, 0.01, 2654435761U);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Generate 32K of compressible data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        RDG_genBuffer(data, compressibleLenU32 * 4, 0.5, 0.5, 0xcafebabe);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Add a match of offset=12, length=8 at idx=16, 32, 48, 64  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + 0] = 0xFFFFFFFF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + 1] = 0xEEEEEEEE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + 4] = 0xFFFFFFFF;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + 5] = 0xEEEEEEEE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Add a match of offset=16, length=8 at idx=64K + 64.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * This generates a sequence with llen=64K, and repeat code 1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * The block splitter thought this was ll0, and corrupted the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * repeat offset history.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + litLenU32 + 2 + 0] = 0xDDDDDDDD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + litLenU32 + 2 + 1] = 0xCCCCCCCC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + litLenU32 + 2 + 4] = 0xDDDDDDDD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[compressibleLenU32 + litLenU32 + 2 + 5] = 0xCCCCCCCC;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Add a match of offset=16, length=8 at idx=128K + 16.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * This should generate a sequence with repeat code = 1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * But the block splitters mistake caused zstd to generate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * repeat code = 2, corrupting the data.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[blockSizeU32] = 0xBBBBBBBB;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[blockSizeU32 + 1] = 0xAAAAAAAA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[blockSizeU32 + 4] = 0xBBBBBBBB;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        data[blockSizeU32 + 5] = 0xAAAAAAAA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Generate a golden file from this data in case datagen changes and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * doesn't generate the exact same data. We will also test this golden file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            FILE* f = fopen("golden-compression/PR-3517-block-splitter-corruption-test", "wb");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            fwrite(data, 1, srcSize, f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            fclose(f);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 19));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 7));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_useBlockSplitter, ZSTD_ps_enable));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, data, srcSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_Z(cSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        dSize = ZSTD_decompress(decodedBuffer, CNBuffSize, compressedBuffer, cSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_Z(dSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK_EQ(dSize, srcSize);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        CHECK(!memcmp(decodedBuffer, data, srcSize));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        free(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        ZSTD_freeCCtx(cctx);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DISPLAYLEVEL(3, "OK \n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DISPLAYLEVEL(3, "test%3d: superblock uncompressible data, too many nocompress superblocks : ", testNb++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ZSTD_CCtx* const cctx = ZSTD_createCCtx();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/golden-compression/PR-3517-block-splitter-corruption-test tests/golden-compression/PR-3517-block-splitter-corruption-test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000..57b01276
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/tests/golden-compression/PR-3517-block-splitter-corruption-test
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++00000001001141010314000000001001141010314000000001001141010314000000000000100114101030100201210004002001101011121121021330200001301031100120041002030000402000010011200001002002200000012020011111010101212010101150100020040101000210011000010022002002000020000211030203010010311031002001201204016014200000222002100002000200300001110040013201000000102105010400200110000221801100100101110100001012102220011016221150330010000002101061012310500273300012003100100000112000000120120002022010202041300 [...]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+\ No newline at end of file
</span></pre><pre style='margin:0'>

</pre>