From 0f3e3e5586768c785f0894f977e928aa55ea54ff Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 1 Nov 2017 00:37:51 +0100 Subject: [PATCH] zlib: warn before crash on invalid internals usage Refs: https://github.com/nodejs/node/issues/16649 Refs: https://github.com/nodejs/node/issues/14161 --- src/node_zlib.cc | 10 ++++++++++ .../test-zlib-invalid-internals-usage.js | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 test/abort/test-zlib-invalid-internals-usage.js diff --git a/src/node_zlib.cc b/src/node_zlib.cc index 067e8d96a0ba5c..a691f451b61802 100644 --- a/src/node_zlib.cc +++ b/src/node_zlib.cc @@ -422,6 +422,16 @@ class ZCtx : public AsyncWrap { // just pull the ints out of the args and call the other Init static void Init(const FunctionCallbackInfo& args) { + // Refs: https://github.com/nodejs/node/issues/16649 + // Refs: https://github.com/nodejs/node/issues/14161 + if (args.Length() == 5) { + fprintf(stderr, + "WARNING: You are likely using a version of node-tar or npm that " + "uses the internals of Node.js in an invalid way.\nPlease use " + "either the version of npm that is bundled with Node.js, or " + "a version of npm (> 5.5.1 or < 5.4.0) or node-tar (> 4.0.1) " + "that is compatible with Node 9 and above.\n"); + } CHECK(args.Length() == 7 && "init(windowBits, level, memLevel, strategy, writeResult, writeCallback," " dictionary)"); diff --git a/test/abort/test-zlib-invalid-internals-usage.js b/test/abort/test-zlib-invalid-internals-usage.js new file mode 100644 index 00000000000000..9a7e08f5ffc048 --- /dev/null +++ b/test/abort/test-zlib-invalid-internals-usage.js @@ -0,0 +1,20 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); + +if (process.argv[2] === 'child') { + // This is the heart of the test. + new (process.binding('zlib').Zlib)(0).init(1, 2, 3, 4, 5); +} else { + const child = cp.spawnSync(`${process.execPath}`, [`${__filename}`, 'child']); + const stderr = child.stderr.toString(); + + assert.strictEqual(child.stdout.toString(), ''); + assert.ok(child.stderr.includes( + 'WARNING: You are likely using a version of node-tar or npm that uses ' + + 'the internals of Node.js in an invalid way.\n' + + 'Please use either the version of npm that is bundled with Node.js, or ' + + 'a version of npm (> 5.5.1 or < 5.4.0) or node-tar (> 4.0.1) that is ' + + 'compatible with Node 9 and above.\n')); +}