Commit 7ba22c28127 for nodejs
commit 7ba22c28127e88d7ce5a207af15fff2fbca71d46
Author: Antoine du Hamel <duhamelantoine1995@gmail.com>
Date: Mon Oct 12 22:42:14 2026 +0200
src: expose `BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH`
Signed-off-by: Antoine du Hamel <duhamelantoine1995@gmail.com>
PR-URL: https://github.com/nodejs-private/node-private/pull/1002
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
CVE-ID: CVE-2026-111497
diff --git a/src/node_zlib.cc b/src/node_zlib.cc
index 246bb5bf58c..d25662bdb98 100644
--- a/src/node_zlib.cc
+++ b/src/node_zlib.cc
@@ -2302,6 +2302,7 @@ void DefineZlibConstants(Local<Object> target) {
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
+ NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH);
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_INVALID_ARGUMENTS);
NODE_DEFINE_CONSTANT(target, BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
diff --git a/test/parallel/test-zlib-invalid-input.js b/test/parallel/test-zlib-invalid-input.js
index 7a0146a5d64..40958b07444 100644
--- a/test/parallel/test-zlib-invalid-input.js
+++ b/test/parallel/test-zlib-invalid-input.js
@@ -89,6 +89,33 @@ Object.defineProperty(spoofedLength, 'byteLength', { get: () => 5000 });
deflate.close();
}
+{
+ // A block switch is invalid when the stream declares only one block type.
+ const invalidBlockSwitch = Buffer.from(
+ '200010414141fcffff07002228f00b60f7f41f000000',
+ 'hex',
+ );
+ const expectedError = {
+ code: 'ERR__ERROR_FORMAT_BLOCK_SWITCH',
+ errno: zlib.constants.BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH,
+ };
+
+ assert.strictEqual(expectedError.errno, -17);
+ assert.throws(
+ () => zlib.brotliDecompressSync(invalidBlockSwitch),
+ expectedError,
+ );
+
+ const brotli = zlib.createBrotliDecompress();
+ brotli.resume();
+ brotli.on('error', common.expectsError(expectedError));
+ brotli.on('end', common.mustNotCall());
+ for (let i = 0; i < invalidBlockSwitch.length; i++) {
+ brotli.write(invalidBlockSwitch.subarray(i, i + 1));
+ }
+ brotli.end();
+}
+
unzips.forEach(common.mustCall((uz, i) => {
uz.on('error', common.mustCall());
uz.on('end', common.mustNotCall());