node icon indicating copy to clipboard operation
node copied to clipboard

Class: Buffer do not follow when the underlying ArrayBuffer is resized

Open klebom opened this issue 1 year ago • 3 comments
trafficstars

Version

v21.7.1

Platform

Microsoft Windows NT 10.0.22631.0 x64

Subsystem

Class: Buffer

What steps will reproduce the bug?

const arraybuffer = new ArrayBuffer(4, { maxByteLength: 4096 });

const uint8array = new Uint8Array(arraybuffer);

uint8array.set([0,1,2,3]);

const buffer = Buffer.from(arraybuffer);

console.error(uint8array);
console.error(buffer);

arraybuffer.resize(8);
uint8array.set([4,5,6,7],4);

uint8array[0]=0xff;

console.error(uint8array);
console.error(buffer);

Output:

Uint8Array(4) [ 0, 1, 2, 3 ]
<Buffer 00 01 02 03>
Uint8Array(8) [
  255, 1, 2, 3,
    4, 5, 6, 7
]
<Buffer ff 01 02 03>

How often does it reproduce? Is there a required condition?

always

What is the expected behavior? Why is that the expected behavior?

Expecting buffer to be resized and output to be:

<Buffer ff 01 02 03 04 05 06 07>

What do you see instead?

<Buffer ff 01 02 03>

Additional information

If the resolution to this is that Buffer isn't going to support ArrayBuffer.resize() that should be reflected in the documentation.

klebom avatar Mar 23 '24 16:03 klebom

Behavior comes from: https://github.com/nodejs/node/blob/bae14b7914624630c3e451def82a8f56c6402534/lib/buffer.js#L476-L505

byteOffset and length are initially undefined, but the function ensures they are numbers, and if they are specified, the typed array's length stays fixed.

/cc @nodejs/buffer

targos avatar Mar 24 '24 09:03 targos

Buffer has always been assumed to be non-resizable. I'm wondering if the right fix for now shouldn't be to forbid creating a Buffer from a resizable ArrayBuffer until we can make sure that all of Buffer's APIs handle it appropriately

jasnell avatar Mar 24 '24 14:03 jasnell

I'm wondering if the right fix for now shouldn't be to forbid creating a Buffer from a resizable ArrayBuffer until we can make sure that all of Buffer's APIs handle it appropriately

This will break me. Please don't.

ronag avatar Aug 26 '24 17:08 ronag