buffer: expose underlying buffer object always
If the Buffer object's length is zero, or equal to the underlying buffer object's length, `parent` property returns `undefined`. > new Buffer(0).parent undefined > new Buffer(Buffer.poolSize).parent undefined This patch makes the buffer objects to consistently expose the buffer object via the `parent` property, always. Fixes: https://github.com/nodejs/node/issues/8266 PR-URL: https://github.com/nodejs/node/pull/8311 Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
e9b6fbbf17
commit
c21458a15d
@ -410,10 +410,6 @@ Object.defineProperty(Buffer.prototype, 'parent', {
|
|||||||
get: function() {
|
get: function() {
|
||||||
if (!(this instanceof Buffer))
|
if (!(this instanceof Buffer))
|
||||||
return undefined;
|
return undefined;
|
||||||
if (this.byteLength === 0 ||
|
|
||||||
this.byteLength === this.buffer.byteLength) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return this.buffer;
|
return this.buffer;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -994,7 +994,7 @@ if (common.hasCrypto) {
|
|||||||
|
|
||||||
const ps = Buffer.poolSize;
|
const ps = Buffer.poolSize;
|
||||||
Buffer.poolSize = 0;
|
Buffer.poolSize = 0;
|
||||||
assert.strictEqual(Buffer.allocUnsafe(1).parent, undefined);
|
assert(Buffer.allocUnsafe(1).parent instanceof ArrayBuffer);
|
||||||
Buffer.poolSize = ps;
|
Buffer.poolSize = ps;
|
||||||
|
|
||||||
// Test Buffer.copy() segfault
|
// Test Buffer.copy() segfault
|
||||||
|
@ -13,9 +13,7 @@ const buf = Buffer.from(ab);
|
|||||||
|
|
||||||
|
|
||||||
assert.ok(buf instanceof Buffer);
|
assert.ok(buf instanceof Buffer);
|
||||||
// For backwards compatibility of old .parent property test that if buf is not
|
assert.equal(buf.parent, buf.buffer);
|
||||||
// a slice then .parent should be undefined.
|
|
||||||
assert.equal(buf.parent, undefined);
|
|
||||||
assert.equal(buf.buffer, ab);
|
assert.equal(buf.buffer, ab);
|
||||||
assert.equal(buf.length, ab.byteLength);
|
assert.equal(buf.length, ab.byteLength);
|
||||||
|
|
||||||
|
23
test/parallel/test-buffer-parent-property.js
Normal file
23
test/parallel/test-buffer-parent-property.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix for https://github.com/nodejs/node/issues/8266
|
||||||
|
*
|
||||||
|
* Zero length Buffer objects should expose the `buffer` property of the
|
||||||
|
* TypedArrays, via the `parent` property.
|
||||||
|
*/
|
||||||
|
require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// If the length of the buffer object is zero
|
||||||
|
assert((new Buffer(0)).parent instanceof ArrayBuffer);
|
||||||
|
|
||||||
|
// If the length of the buffer object is equal to the underlying ArrayBuffer
|
||||||
|
assert((new Buffer(Buffer.poolSize)).parent instanceof ArrayBuffer);
|
||||||
|
|
||||||
|
// Same as the previous test, but with user created buffer
|
||||||
|
const arrayBuffer = new ArrayBuffer(0);
|
||||||
|
assert.strictEqual(new Buffer(arrayBuffer).parent, arrayBuffer);
|
||||||
|
assert.strictEqual(new Buffer(arrayBuffer).buffer, arrayBuffer);
|
||||||
|
assert.strictEqual(Buffer.from(arrayBuffer).parent, arrayBuffer);
|
||||||
|
assert.strictEqual(Buffer.from(arrayBuffer).buffer, arrayBuffer);
|
Loading…
x
Reference in New Issue
Block a user