zlib: remove prototype primordials usage

# Conflicts:
#	lib/zlib.js

PR-URL: https://github.com/nodejs/node/pull/54695
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ruy Adorno <ruy@vlt.sh>
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Matthew Aitken <maitken033380023@gmail.com>
This commit is contained in:
Yagiz Nizipli 2024-09-18 23:16:20 -04:00 committed by GitHub
parent 59c7c55aad
commit c42d8461b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 27 deletions

View File

@ -10,6 +10,7 @@ important than reliability against prototype pollution:
* `node:http`
* `node:http2`
* `node:tls`
* `node:zlib`
Usage of primordials should be preferred for new code in other areas, but
replacing current code with primordials should be

View File

@ -498,6 +498,7 @@ export default [
'lib/internal/http.js',
'lib/internal/http2/*.js',
'lib/tls.js',
'lib/zlib.js',
],
rules: {
'no-restricted-syntax': [

View File

@ -23,21 +23,16 @@
const {
ArrayBuffer,
ArrayPrototypeForEach,
ArrayPrototypeMap,
ArrayPrototypePush,
FunctionPrototypeBind,
MathMaxApply,
MathMax,
NumberIsNaN,
ObjectDefineProperties,
ObjectDefineProperty,
ObjectEntries,
ObjectFreeze,
ObjectKeys,
ObjectSetPrototypeOf,
ReflectApply,
StringPrototypeStartsWith,
Symbol,
TypedArrayPrototypeFill,
Uint32Array,
} = primordials;
@ -130,10 +125,11 @@ function zlibBuffer(engine, buffer, callback) {
}
function zlibBufferOnData(chunk) {
if (!this.buffers)
if (!this.buffers) {
this.buffers = [chunk];
else
ArrayPrototypePush(this.buffers, chunk);
} else {
this.buffers.push(chunk);
}
this.nread += chunk.length;
if (this.nread > this._maxOutputLength) {
this.close();
@ -442,7 +438,7 @@ function processChunkSync(self, chunk, flushFlag) {
if (have > 0) {
const out = buffer.slice(offset, offset + have);
offset += have;
ArrayPrototypePush(buffers, out);
buffers.push(out);
nread += out.byteLength;
if (nread > self._maxOutputLength) {
@ -700,9 +696,10 @@ Zlib.prototype.params = function params(level, strategy, callback) {
checkRangesOrGetDefault(strategy, 'strategy', Z_DEFAULT_STRATEGY, Z_FIXED);
if (this._level !== level || this._strategy !== strategy) {
this.flush(Z_SYNC_FLUSH,
FunctionPrototypeBind(paramsAfterFlushCallback, this,
level, strategy, callback));
this.flush(
Z_SYNC_FLUSH,
paramsAfterFlushCallback.bind(this, level, strategy, callback),
);
} else {
process.nextTick(callback);
}
@ -782,13 +779,10 @@ function createConvenienceMethod(ctor, sync) {
};
}
const kMaxBrotliParam = MathMaxApply(ArrayPrototypeMap(
ObjectKeys(constants),
(key) => (StringPrototypeStartsWith(key, 'BROTLI_PARAM_') ?
constants[key] :
0),
));
const kMaxBrotliParam = MathMax(
...ObjectEntries(constants)
.map(({ 0: key, 1: value }) => (key.startsWith('BROTLI_PARAM_') ? value : 0)),
);
const brotliInitParamsArray = new Uint32Array(kMaxBrotliParam + 1);
const brotliDefaultOpts = {
@ -799,9 +793,9 @@ const brotliDefaultOpts = {
function Brotli(opts, mode) {
assert(mode === BROTLI_DECODE || mode === BROTLI_ENCODE);
TypedArrayPrototypeFill(brotliInitParamsArray, -1);
brotliInitParamsArray.fill(-1);
if (opts?.params) {
ArrayPrototypeForEach(ObjectKeys(opts.params), (origKey) => {
ObjectKeys(opts.params).forEach((origKey) => {
const key = +origKey;
if (NumberIsNaN(key) || key < 0 || key > kMaxBrotliParam ||
(brotliInitParamsArray[key] | 0) !== -1) {
@ -939,10 +933,12 @@ ObjectDefineProperties(module.exports, {
// These should be considered deprecated
// expose all the zlib constants
for (const bkey of ObjectKeys(constants)) {
if (StringPrototypeStartsWith(bkey, 'BROTLI')) continue;
ObjectDefineProperty(module.exports, bkey, {
for (const { 0: key, 1: value } of ObjectEntries(constants)) {
if (key.startsWith('BROTLI')) continue;
ObjectDefineProperty(module.exports, key, {
__proto__: null,
enumerable: false, value: constants[bkey], writable: false,
enumerable: false,
value,
writable: false,
});
}