From 58d67e26a2a787f3074e9488a9337947577bef32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Fri, 29 Jan 2016 14:00:02 +0100 Subject: [PATCH] buffer: validate list elements in Buffer.concat Without this change, if any of the elements in the list to be concatenated is not a Buffer instance, the method fails with "buf.copy is not a function". Make an isBuffer check before using the copy method so that we can throw with a better message. Fixes: https://github.com/nodejs/node/issues/4949 PR-URL: https://github.com/nodejs/node/pull/4951 Reviewed-By: Colin Ihrig Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Roman Klauke --- lib/buffer.js | 4 +++- test/parallel/test-buffer-concat.js | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 1035ab06d1783b..bd2c859c3ee389 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -219,7 +219,7 @@ Buffer.isEncoding = function(encoding) { Buffer.concat = function(list, length) { if (!Array.isArray(list)) - throw new TypeError('list argument must be an Array of Buffers.'); + throw new TypeError('list argument must be an Array of Buffers'); if (list.length === 0) return new Buffer(0); @@ -236,6 +236,8 @@ Buffer.concat = function(list, length) { var pos = 0; for (let i = 0; i < list.length; i++) { var buf = list[i]; + if (!Buffer.isBuffer(buf)) + throw new TypeError('list argument must be an Array of Buffers'); buf.copy(buffer, pos); pos += buf.length; } diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 07f763a76dc419..527d7d69bacaba 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -20,8 +20,18 @@ assert(flatOne !== one[0]); assert(flatLong.toString() === (new Array(10 + 1).join('asdf'))); assert(flatLongLen.toString() === (new Array(10 + 1).join('asdf'))); -assert.throws(function() { - Buffer.concat([42]); -}, TypeError); +assertWrongList(); +assertWrongList(null); +assertWrongList(new Buffer('hello')); +assertWrongList([42]); +assertWrongList(['hello', 'world']); +assertWrongList(['hello', new Buffer('world')]); -console.log('ok'); +function assertWrongList(value) { + assert.throws(function() { + Buffer.concat(value); + }, function(err) { + return err instanceof TypeError && + err.message === 'list argument must be an Array of Buffers'; + }); +}