From 8d14a9db2f0dd66492fadc498ae0070398d31d89 Mon Sep 17 00:00:00 2001 From: ud2 Date: Fri, 28 Jun 2024 05:45:46 +0800 Subject: [PATCH] fix(ext/node): make next tick queue resilient to `Array.prototype` tampering (#24361) Closes #24358. --- ext/node/polyfills/internal/fixed_queue.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ext/node/polyfills/internal/fixed_queue.ts b/ext/node/polyfills/internal/fixed_queue.ts index d98a5e507cd23..0a2209c8d539b 100644 --- a/ext/node/polyfills/internal/fixed_queue.ts +++ b/ext/node/polyfills/internal/fixed_queue.ts @@ -1,8 +1,8 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright Joyent, Inc. and other Node contributors. -// TODO(petamoriken): enable prefer-primordials for node polyfills -// deno-lint-ignore-file prefer-primordials +import { primordials } from "ext:core/mod.js"; +const { ArrayFrom } = primordials; // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. const kSize = 2048; @@ -65,7 +65,7 @@ class FixedCircularBuffer { constructor() { this.bottom = 0; this.top = 0; - this.list = new Array(kSize); + this.list = ArrayFrom({ __proto__: null, length: kSize }); this.next = null; } @@ -111,11 +111,13 @@ export class FixedQueue { // and sets it as the new main queue. this.head = this.head.next = new FixedCircularBuffer(); } + // deno-lint-ignore prefer-primordials -- `push` is a method of `FixedCircularBuffer` this.head.push(data); } shift() { const tail = this.tail; + // deno-lint-ignore prefer-primordials -- `shift` is a method of `FixedCircularBuffer` const next = tail.shift(); if (tail.isEmpty() && tail.next !== null) { // If there is another queue, it forms the new tail.