Browse Source

buffer: add isSharedArrayBuffer checks

Fixes: https://github.com/nodejs/node/issues/8440
PR-URL: https://github.com/nodejs/node/pull/8510
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
v7.x
Ojas Shirekar 8 years ago
committed by Brian White
parent
commit
2a2ec9dbc3
No known key found for this signature in database GPG Key ID: 606D7358F94DA209
  1. 11
      lib/buffer.js
  2. 1
      src/node_util.cc
  3. 29
      test/parallel/test-buffer-sharedarraybuffer.js

11
lib/buffer.js

@ -2,7 +2,7 @@
'use strict'; 'use strict';
const binding = process.binding('buffer'); const binding = process.binding('buffer');
const { isArrayBuffer } = process.binding('util'); const { isArrayBuffer, isSharedArrayBuffer } = process.binding('util');
const bindingObj = {}; const bindingObj = {};
const internalUtil = require('internal/util'); const internalUtil = require('internal/util');
@ -103,7 +103,7 @@ Buffer.from = function(value, encodingOrOffset, length) {
if (typeof value === 'number') if (typeof value === 'number')
throw new TypeError('"value" argument must not be a number'); throw new TypeError('"value" argument must not be a number');
if (isArrayBuffer(value)) if (isArrayBuffer(value) || isSharedArrayBuffer(value))
return fromArrayBuffer(value, encodingOrOffset, length); return fromArrayBuffer(value, encodingOrOffset, length);
if (typeof value === 'string') if (typeof value === 'string')
@ -264,7 +264,8 @@ function fromObject(obj) {
} }
if (obj) { if (obj) {
if (isArrayBuffer(obj.buffer) || 'length' in obj) { if (isArrayBuffer(obj.buffer) || 'length' in obj ||
isSharedArrayBuffer(obj)) {
if (typeof obj.length !== 'number' || obj.length !== obj.length) { if (typeof obj.length !== 'number' || obj.length !== obj.length) {
return new FastBuffer(); return new FastBuffer();
} }
@ -351,8 +352,10 @@ function base64ByteLength(str, bytes) {
function byteLength(string, encoding) { function byteLength(string, encoding) {
if (typeof string !== 'string') { if (typeof string !== 'string') {
if (ArrayBuffer.isView(string) || isArrayBuffer(string)) if (ArrayBuffer.isView(string) || isArrayBuffer(string) ||
isSharedArrayBuffer(string)) {
return string.byteLength; return string.byteLength;
}
string = '' + string; string = '' + string;
} }

1
src/node_util.cc

@ -20,6 +20,7 @@ using v8::Value;
#define VALUE_METHOD_MAP(V) \ #define VALUE_METHOD_MAP(V) \
V(isArrayBuffer, IsArrayBuffer) \ V(isArrayBuffer, IsArrayBuffer) \
V(isSharedArrayBuffer, IsSharedArrayBuffer) \
V(isDataView, IsDataView) \ V(isDataView, IsDataView) \
V(isDate, IsDate) \ V(isDate, IsDate) \
V(isMap, IsMap) \ V(isMap, IsMap) \

29
test/parallel/test-buffer-sharedarraybuffer.js

@ -0,0 +1,29 @@
/*global SharedArrayBuffer*/
'use strict';
// Flags: --harmony-sharedarraybuffer
require('../common');
const assert = require('assert');
const Buffer = require('buffer').Buffer;
const sab = new SharedArrayBuffer(24);
const arr1 = new Uint16Array(sab);
const arr2 = new Uint16Array(12);
arr2[0] = 5000;
arr1[0] = 5000;
arr1[1] = 4000;
arr2[1] = 4000;
const arr_buf = Buffer.from(arr1.buffer);
const ar_buf = Buffer.from(arr2.buffer);
assert.deepStrictEqual(arr_buf, ar_buf, 0);
arr1[1] = 6000;
arr2[1] = 6000;
assert.deepStrictEqual(arr_buf, ar_buf, 0);
// Checks for calling Buffer.byteLength on a SharedArrayBuffer
assert.strictEqual(Buffer.byteLength(sab), sab.byteLength, 0);
Loading…
Cancel
Save