diff --git a/lib/buffer.js b/lib/buffer.js index 9754cfeeb50b94..b2325098bcbb9d 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -807,8 +807,10 @@ Buffer.prototype.toJSON = function() { function adjustOffset(offset, length) { - offset |= 0; - if (offset === 0) { + // Use Math.trunc() to convert offset to an integer value that can be larger + // than an Int32. Hence, don't use offset | 0 or similar techniques. + offset = Math.trunc(offset); + if (offset === 0 || Number.isNaN(offset)) { return 0; } else if (offset < 0) { offset += length; diff --git a/test/parallel/test-buffer-slice.js b/test/parallel/test-buffer-slice.js index e5b598e62519e7..076bf33fb07736 100644 --- a/test/parallel/test-buffer-slice.js +++ b/test/parallel/test-buffer-slice.js @@ -72,3 +72,30 @@ assert.strictEqual(0, Buffer.from('hello').slice(0, 0).length); 'bcd' ); } + +{ + const buf = Buffer.from('abcdefg'); + assert.strictEqual(buf.slice(-(-1 >>> 0) - 1).toString(), buf.toString()); +} + +{ + const buf = Buffer.from('abc'); + assert.strictEqual(buf.slice(-0.5).toString(), buf.toString()); +} + +{ + const buf = Buffer.from([ + 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, + 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0 + ]); + const chunk1 = Buffer.from([ + 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0 + ]); + const chunk2 = Buffer.from([ + 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0 + ]); + const middle = buf.length / 2; + + assert.deepStrictEqual(buf.slice(0, middle), chunk1); + assert.deepStrictEqual(buf.slice(middle), chunk2); +}