Skip to content

Commit

Permalink
buffer: expose underlying buffer object always
Browse files Browse the repository at this point in the history
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: #8266
PR-URL: #8311
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
thefourtheye authored and addaleax committed Sep 8, 2016
1 parent e9b6fbb commit c21458a
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 8 deletions.
4 changes: 0 additions & 4 deletions lib/buffer.js
Expand Up @@ -410,10 +410,6 @@ Object.defineProperty(Buffer.prototype, 'parent', {
get: function() {
if (!(this instanceof Buffer))
return undefined;
if (this.byteLength === 0 ||
this.byteLength === this.buffer.byteLength) {
return undefined;
}
return this.buffer;
}
});
Expand Down
2 changes: 1 addition & 1 deletion test/parallel/test-buffer-alloc.js
Expand Up @@ -994,7 +994,7 @@ if (common.hasCrypto) {

const ps = Buffer.poolSize;
Buffer.poolSize = 0;
assert.strictEqual(Buffer.allocUnsafe(1).parent, undefined);
assert(Buffer.allocUnsafe(1).parent instanceof ArrayBuffer);
Buffer.poolSize = ps;

// Test Buffer.copy() segfault
Expand Down
4 changes: 1 addition & 3 deletions test/parallel/test-buffer-arraybuffer.js
Expand Up @@ -13,9 +13,7 @@ const buf = Buffer.from(ab);


assert.ok(buf instanceof Buffer);
// For backwards compatibility of old .parent property test that if buf is not
// a slice then .parent should be undefined.
assert.equal(buf.parent, undefined);
assert.equal(buf.parent, buf.buffer);
assert.equal(buf.buffer, ab);
assert.equal(buf.length, ab.byteLength);

Expand Down
23 changes: 23 additions & 0 deletions test/parallel/test-buffer-parent-property.js
@@ -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);

0 comments on commit c21458a

Please sign in to comment.