Browse Source

buffer: fix usage of kMaxLength

Starting in V8 v4.3 the maximum array index of a typed array is the same
as the largest Smi supported on a given architecture. To compensate for
these differences export kMaxLength from the buffer module with the
correct size for the given architecture.

PR-URL: https://github.com/nodejs/io.js/pull/2003
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
v4.0.0-rc
Trevor Norris 10 years ago
committed by Rod Vagg
parent
commit
b625ab4242
  1. 2
      lib/fs.js
  2. 1
      lib/internal/buffer_new.js
  3. 1
      lib/internal/buffer_old.js
  4. 2
      lib/zlib.js
  5. 11
      src/node_buffer.cc
  6. 11
      test/parallel/test-regress-GH-io-1811.js

2
lib/fs.js

@ -20,7 +20,7 @@ const Readable = Stream.Readable;
const Writable = Stream.Writable; const Writable = Stream.Writable;
const kMinPoolSpace = 128; const kMinPoolSpace = 128;
const kMaxLength = process.binding('smalloc').kMaxLength; const kMaxLength = require('buffer').kMaxLength;
const O_APPEND = constants.O_APPEND || 0; const O_APPEND = constants.O_APPEND || 0;
const O_CREAT = constants.O_CREAT || 0; const O_CREAT = constants.O_CREAT || 0;

1
lib/internal/buffer_new.js

@ -6,6 +6,7 @@ const internalUtil = require('internal/util');
exports.Buffer = Buffer; exports.Buffer = Buffer;
exports.SlowBuffer = SlowBuffer; exports.SlowBuffer = SlowBuffer;
exports.INSPECT_MAX_BYTES = 50; exports.INSPECT_MAX_BYTES = 50;
exports.kMaxLength = binding.kMaxLength;
Buffer.poolSize = 8 * 1024; Buffer.poolSize = 8 * 1024;

1
lib/internal/buffer_old.js

@ -11,6 +11,7 @@ const kMaxLength = smalloc.kMaxLength;
exports.Buffer = Buffer; exports.Buffer = Buffer;
exports.SlowBuffer = SlowBuffer; exports.SlowBuffer = SlowBuffer;
exports.INSPECT_MAX_BYTES = 50; exports.INSPECT_MAX_BYTES = 50;
exports.kMaxLength = binding.kMaxLength;
Buffer.poolSize = 8 * 1024; Buffer.poolSize = 8 * 1024;

2
lib/zlib.js

@ -5,7 +5,7 @@ const Transform = require('_stream_transform');
const binding = process.binding('zlib'); const binding = process.binding('zlib');
const util = require('util'); const util = require('util');
const assert = require('assert').ok; const assert = require('assert').ok;
const kMaxLength = process.binding('smalloc').kMaxLength; const kMaxLength = require('buffer').kMaxLength;
const kRangeErrorMessage = 'Cannot create final Buffer. ' + const kRangeErrorMessage = 'Cannot create final Buffer. ' +
'It would be larger than 0x' + kMaxLength.toString(16) + ' bytes.'; 'It would be larger than 0x' + kMaxLength.toString(16) + ' bytes.';

11
src/node_buffer.cc

@ -71,6 +71,7 @@ using v8::FunctionCallbackInfo;
using v8::FunctionTemplate; using v8::FunctionTemplate;
using v8::Handle; using v8::Handle;
using v8::HandleScope; using v8::HandleScope;
using v8::Integer;
using v8::Isolate; using v8::Isolate;
using v8::Local; using v8::Local;
using v8::Maybe; using v8::Maybe;
@ -1188,6 +1189,16 @@ void Initialize(Handle<Object> target,
env->SetMethod(target, "writeDoubleLE", WriteDoubleLE); env->SetMethod(target, "writeDoubleLE", WriteDoubleLE);
env->SetMethod(target, "writeFloatBE", WriteFloatBE); env->SetMethod(target, "writeFloatBE", WriteFloatBE);
env->SetMethod(target, "writeFloatLE", WriteFloatLE); env->SetMethod(target, "writeFloatLE", WriteFloatLE);
uint32_t kMaxLength;
if (sizeof(int32_t) == sizeof(intptr_t) || using_old_buffer) {
kMaxLength = 0x3fffffff;
} else {
kMaxLength = 0x7fffffff;
}
target->Set(env->context(),
FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
Integer::NewFromUnsigned(env->isolate(), kMaxLength)).FromJust();
} }

11
test/parallel/test-regress-GH-io-1811.js

@ -2,12 +2,13 @@
const assert = require('assert'); const assert = require('assert');
// Change kMaxLength for zlib to trigger the error // Change kMaxLength for zlib to trigger the error without having to allocate
// without having to allocate 1GB of buffers // large Buffers.
const smalloc = process.binding('smalloc'); const buffer = require('buffer');
smalloc.kMaxLength = 128; const oldkMaxLength = buffer.kMaxLength;
buffer.kMaxLength = 128;
const zlib = require('zlib'); const zlib = require('zlib');
smalloc.kMaxLength = 0x3fffffff; buffer.kMaxLength = oldkMaxLength;
const encoded = new Buffer('H4sIAAAAAAAAA0tMHFgAAIw2K/GAAAAA', 'base64'); const encoded = new Buffer('H4sIAAAAAAAAA0tMHFgAAIw2K/GAAAAA', 'base64');

Loading…
Cancel
Save