Bug 1329187 - Call GetPrototypeFromConstructor before checking the ArrayBuffer length. r=evilpie

--HG--
extra : rebase_source : 1012281bfb8d2c6ed4fc4028a0c683aeb90c81e4
This commit is contained in:
André Bargull 2017-01-11 14:08:00 -08:00
Родитель 4c88a6f7d9
Коммит 69b9b9f2ec
2 изменённых файлов: 48 добавлений и 7 удалений

Просмотреть файл

@ -0,0 +1,38 @@
// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 24.1.2.1
description: >
The new ArrayBuffer instance is created prior to allocating the Data Block.
info: >
ArrayBuffer( length )
...
6. Return AllocateArrayBuffer(NewTarget, byteLength).
AllocateArrayBuffer( constructor, byteLength )
1. Let obj be OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%",
«[[ArrayBufferData]], [[ArrayBufferByteLength]]» ).
2. ReturnIfAbrupt(obj).
...
4. Let block be CreateByteDataBlock(byteLength).
5. ReturnIfAbrupt(block).
...
features: [Reflect.construct]
---*/
function DummyError() { }
var newTarget = function(){}.bind(null);
Object.defineProperty(newTarget, "prototype", {
get: function() {
throw new DummyError();
}
});
assert.throws(DummyError, function() {
// Allocating 7 PiB should fail with a RangeError.
// Math.pow(1024, 5) = 1125899906842624
Reflect.construct(ArrayBuffer, [7 * 1125899906842624], newTarget);
});

Просмотреть файл

@ -280,18 +280,21 @@ ArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp)
if (!ToIndex(cx, args.get(0), &byteLength))
return false;
// Non-standard: Refuse to allocate buffers larger than ~2 GiB.
if (byteLength > INT32_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH);
return false;
}
// Step 3.
// Step 3 (Inlined 24.1.1.1 AllocateArrayBuffer).
// 24.1.1.1, step 1 (Inlined 9.1.14 OrdinaryCreateFromConstructor).
RootedObject proto(cx);
RootedObject newTarget(cx, &args.newTarget().toObject());
if (!GetPrototypeFromConstructor(cx, newTarget, &proto))
return false;
// 24.1.1.1, step 3 (Inlined 6.2.6.1 CreateByteDataBlock, step 2).
// Refuse to allocate too large buffers, currently limited to ~2 GiB.
if (byteLength > INT32_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH);
return false;
}
// 24.1.1.1, steps 1 and 4-6.
JSObject* bufobj = create(cx, uint32_t(byteLength), proto);
if (!bufobj)
return false;