From 2986170c93e992eedc8768314f31285c01cfcdf8 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 25 Aug 2019 21:44:59 +0200 Subject: [PATCH] util: do not throw when inspecting detached ArrayBuffer PR-URL: https://github.com/nodejs/node/pull/29318 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Trivikram Kamat Reviewed-By: Jeremiah Senkpiel Reviewed-By: Gus Caplan --- lib/internal/util/inspect.js | 7 ++++++- test/parallel/test-util-inspect.js | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index 20bdc33786054f..0319697d3270d0 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -1164,7 +1164,12 @@ function formatSpecialArray(ctx, value, recurseTimes, maxLength, output, i) { } function formatArrayBuffer(ctx, value) { - const buffer = new Uint8Array(value); + let buffer; + try { + buffer = new Uint8Array(value); + } catch { + return [ctx.stylize('(detached)', 'special')]; + } if (hexSlice === undefined) hexSlice = uncurryThis(require('buffer').Buffer.prototype.hexSlice); let str = hexSlice(buffer, 0, Math.min(ctx.maxArrayLength, buffer.length)) diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index f4f76a4981488f..4cb8224c541f45 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -28,6 +28,7 @@ const util = require('util'); const vm = require('vm'); const { previewEntries } = internalBinding('util'); const { inspect } = util; +const { MessageChannel } = require('worker_threads'); assert.strictEqual(util.inspect(1), '1'); assert.strictEqual(util.inspect(false), 'false'); @@ -198,6 +199,15 @@ assert(!/Object/.test( ' y: 1337\n}'); } +{ + const ab = new ArrayBuffer(42); + assert.strictEqual(ab.byteLength, 42); + new MessageChannel().port1.postMessage(ab, [ ab ]); + assert.strictEqual(ab.byteLength, 0); + assert.strictEqual(util.inspect(ab), + 'ArrayBuffer { (detached), byteLength: 0 }'); +} + // Now do the same checks but from a different context. { const showHidden = false;