From b7f65acb71ed0c7ac257de0c3bd5663871a492c7 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Fri, 10 Apr 2020 20:25:48 +0200 Subject: [PATCH 1/3] buffer: add type check in bidirectionalIndexOf Add a type check in bidirectionalIndexOf to avoid using something else as Buffer. This may happen if e.g. lastIndexOf is called with invalid this. --- lib/buffer.js | 4 ++++ test/parallel/test-buffer-indexof.js | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/buffer.js b/lib/buffer.js index d83a5a30d9e1b8..11c9411e232878 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -899,6 +899,10 @@ Buffer.prototype.compare = function compare(target, // - encoding - an optional encoding, relevant if val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { + if (!Buffer.isBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', 'Buffer', buffer); + } + if (typeof byteOffset === 'string') { encoding = byteOffset; byteOffset = undefined; diff --git a/test/parallel/test-buffer-indexof.js b/test/parallel/test-buffer-indexof.js index d789c9b46cf868..5937cbcf49adad 100644 --- a/test/parallel/test-buffer-indexof.js +++ b/test/parallel/test-buffer-indexof.js @@ -606,3 +606,17 @@ assert.strictEqual(reallyLong.lastIndexOf(pattern), 0); assert.strictEqual(haystack.indexOf(needle), 2); assert.strictEqual(haystack.lastIndexOf(needle), haystack.length - 3); } + +// Avoid abort because of invalid usage +// see https://github.com/nodejs/node/issues/32753 +{ + assert.throws(() => { + const buffer = require('buffer'); + new buffer.Buffer.prototype.lastIndexOf(1, 'str'); + }, { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + message: 'The "buffer" argument must be an instance of Buffer. ' + + 'Received an instance of lastIndexOf' + }); +} From ef52a765c7e011c51e7caf5b680b98de701c9849 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Sat, 11 Apr 2020 00:10:25 +0200 Subject: [PATCH 2/3] allow ArrayBufferView --- lib/buffer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 11c9411e232878..c9e6c458590b63 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -899,7 +899,7 @@ Buffer.prototype.compare = function compare(target, // - encoding - an optional encoding, relevant if val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { - if (!Buffer.isBuffer(buffer)) { + if (!isArrayBufferView(buffer)) { throw new ERR_INVALID_ARG_TYPE('buffer', 'Buffer', buffer); } @@ -915,7 +915,7 @@ function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { byteOffset = +byteOffset; // If the offset is undefined, "foo", {}, coerces to NaN, search whole buffer. if (NumberIsNaN(byteOffset)) { - byteOffset = dir ? 0 : buffer.length; + byteOffset = dir ? 0 : (buffer.length || buffer.byteLength); } dir = !!dir; // Cast to bool. From 0a7ff5051abd81834d45e7ebf29cd2b40bf35099 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Sat, 11 Apr 2020 20:55:18 +0200 Subject: [PATCH 3/3] use validateBuffer --- lib/buffer.js | 5 ++--- test/parallel/test-buffer-indexof.js | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index c9e6c458590b63..52e499241ea58c 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -95,6 +95,7 @@ const { hideStackFrames } = require('internal/errors'); const { + validateBuffer, validateInt32, validateString } = require('internal/validators'); @@ -899,9 +900,7 @@ Buffer.prototype.compare = function compare(target, // - encoding - an optional encoding, relevant if val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { - if (!isArrayBufferView(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', 'Buffer', buffer); - } + validateBuffer(buffer); if (typeof byteOffset === 'string') { encoding = byteOffset; diff --git a/test/parallel/test-buffer-indexof.js b/test/parallel/test-buffer-indexof.js index 5937cbcf49adad..b17520366e506a 100644 --- a/test/parallel/test-buffer-indexof.js +++ b/test/parallel/test-buffer-indexof.js @@ -616,7 +616,8 @@ assert.strictEqual(reallyLong.lastIndexOf(pattern), 0); }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', - message: 'The "buffer" argument must be an instance of Buffer. ' + + message: 'The "buffer" argument must be an instance of Buffer, ' + + 'TypedArray, or DataView. ' + 'Received an instance of lastIndexOf' }); }