0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00

test: fix flaky async-hooks/test-zlib.zlib-binding.deflate

Previously, the typed arrays used in this test would not
automatically be kept alive by the native handle when
it’s using them, so the V8 garbage collector could collect
them while they are still in use by the zlib module,
leading to memory corruption.

Fixes: https://github.com/nodejs/node/issues/20907

PR-URL: https://github.com/nodejs/node/pull/21077
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Yang Guo <yangguo@chromium.org>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Anna Henningsen 2018-06-01 09:57:05 +02:00
parent 1c07ebfd97
commit 2efe4c29fe
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9

View File

@ -21,23 +21,29 @@ assert.strictEqual(typeof hdl.uid, 'number');
assert.strictEqual(typeof hdl.triggerAsyncId, 'number');
checkInvocations(hdl, { init: 1 }, 'when created handle');
// Store all buffers together so that they do not get
// garbage collected.
const buffers = {
writeResult: new Uint32Array(2),
dictionary: new Uint8Array(0),
inBuf: new Uint8Array([0x78]),
outBuf: new Uint8Array(1)
};
handle.init(
constants.Z_DEFAULT_WINDOWBITS,
constants.Z_MIN_LEVEL,
constants.Z_DEFAULT_MEMLEVEL,
constants.Z_DEFAULT_STRATEGY,
new Uint32Array(2),
buffers.writeResult,
function processCallback() { this.cb(); },
Buffer.from('')
buffers.dictionary
);
checkInvocations(hdl, { init: 1 }, 'when initialized handle');
const inBuf = Buffer.from('x');
const outBuf = Buffer.allocUnsafe(1);
let count = 2;
handle.cb = common.mustCall(onwritten, 2);
handle.write(true, inBuf, 0, 1, outBuf, 0, 1);
handle.write(true, buffers.inBuf, 0, 1, buffers.outBuf, 0, 1);
checkInvocations(hdl, { init: 1 }, 'when invoked write() on handle');
function onwritten() {
@ -45,7 +51,7 @@ function onwritten() {
// first write
checkInvocations(hdl, { init: 1, before: 1 },
'when wrote to handle the first time');
handle.write(true, inBuf, 0, 1, outBuf, 0, 1);
handle.write(true, buffers.inBuf, 0, 1, buffers.outBuf, 0, 1);
} else {
// second write
checkInvocations(hdl, { init: 1, before: 2, after: 1 },
@ -61,4 +67,7 @@ function onexit() {
// TODO: destroy never called here even with large amounts of ticks
// is that correct?
checkInvocations(hdl, { init: 1, before: 2, after: 2 }, 'when process exits');
// Do something with `buffers` to keep them alive until here.
buffers.buffers = buffers;
}