Skip to content

Commit

Permalink
buffer: zero-fill uninitialized bytes in .concat()
Browse files Browse the repository at this point in the history
This makes sure that no uninitialized bytes are leaked when the specified
`totalLength` input value is greater than the actual total length of the
specified buffers array, e.g. in Buffer.concat([Buffer.alloc(0)], 100).

PR-URL: nodejs-private/node-private#66
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
ChALkeR authored and rvagg committed Sep 27, 2016
1 parent 9dbde2f commit 38d7258
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,14 @@ Buffer.concat = function(list, length) {
pos += buf.length;
}

// Note: `length` is always equal to `buffer.length` at this point
if (pos < length) {
// Zero-fill the remaining bytes if the specified `length` was more than
// the actual total length, i.e. if we have some remaining allocated bytes
// there were not initialized.
buffer.fill(0, pos, length);
}

return buffer;
};

Expand Down
18 changes: 18 additions & 0 deletions test/simple/test-buffer-concat.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,22 @@ assert(flatOne === one[0]);
assert(flatLong.toString() === (new Array(10+1).join('asdf')));
assert(flatLongLen.toString() === (new Array(10+1).join('asdf')));

var ones = new Buffer(10).fill('1');
var empty = new Buffer(0);

assert.equal(Buffer.concat([], 100).toString(), '');
assert.equal(Buffer.concat([ones], 0).toString(), ones.toString()); // 0.12.x
assert.equal(Buffer.concat([ones], 10).toString(), ones.toString());
assert.equal(Buffer.concat([ones, ones], 10).toString(), ones.toString());
assert.equal(Buffer.concat([empty, ones]).toString(), ones.toString());
assert.equal(Buffer.concat([ones, empty, empty]).toString(), ones.toString());

// The tail should be zero-filled
assert.equal(
Buffer.concat([empty, empty], 100).toString(),
new Buffer(100).fill(0).toString());
assert.equal(
Buffer.concat([empty, ones], 40).toString(),
Buffer.concat([ones, new Buffer(30).fill(0)]).toString());

console.log("ok");

0 comments on commit 38d7258

Please sign in to comment.