@@ -22,22 +22,33 @@ WebAssemblyMemory::WebAssemblyMemory(ArrayBufferBase* buffer, uint32 initial, ui
22
22
}
23
23
24
24
25
- _Must_inspect_result_ bool WebAssemblyMemory::AreLimitsValid ( uint32 initial, uint32 maximum)
25
+ void WebAssemblyMemory::CheckLimits (ScriptContext * scriptContext, uint32 initial, uint32 maximum)
26
26
{
27
- return initial <= maximum && initial <= Wasm::Limits::GetMaxMemoryInitialPages () && maximum <= Wasm::Limits::GetMaxMemoryMaximumPages ();
27
+ if (maximum < initial)
28
+ {
29
+ JavascriptError::ThrowRangeError (scriptContext, JSERR_ArgumentOutOfRange);
30
+ }
31
+ if (initial > Wasm::Limits::GetMaxMemoryInitialPages ())
32
+ {
33
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_FunctionArgument_Invalid, _u (" descriptor.initial" ));
34
+ }
35
+ if (maximum > Wasm::Limits::GetMaxMemoryMaximumPages ())
36
+ {
37
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_FunctionArgument_Invalid, _u (" descriptor.maximum" ));
38
+ }
28
39
}
29
40
30
41
31
- _Must_inspect_result_ bool WebAssemblyMemory::AreLimitsValid ( uint32 initial, uint32 maximum, uint32 bufferLength)
42
+ void WebAssemblyMemory::CheckLimits (ScriptContext * scriptContext, uint32 initial, uint32 maximum, uint32 bufferLength)
32
43
{
33
- if (!AreLimitsValid (initial, maximum))
34
- {
35
- return false ;
36
- }
44
+ CheckLimits (scriptContext, initial, maximum);
37
45
// Do the mul after initial checks to avoid potential unneeded OOM exception
38
46
const uint32 initBytes = UInt32Math::Mul<WebAssembly::PageSize>(initial);
39
47
const uint32 maxBytes = UInt32Math::Mul<WebAssembly::PageSize>(maximum);
40
- return initBytes <= bufferLength && bufferLength <= maxBytes;
48
+ if (initBytes > bufferLength || bufferLength > maxBytes)
49
+ {
50
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_FunctionArgument_Invalid);
51
+ }
41
52
}
42
53
43
54
Var
@@ -60,10 +71,14 @@ WebAssemblyMemory::NewInstance(RecyclableObject* function, CallInfo callInfo, ..
60
71
61
72
if (args.Info .Count < 2 || !JavascriptOperators::IsObject (args[1 ]))
62
73
{
63
- JavascriptError::ThrowTypeError (scriptContext, JSERR_NeedObject, _u (" memoryDescriptor " ));
74
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_NeedObject, _u (" descriptor " ));
64
75
}
65
76
DynamicObject * memoryDescriptor = VarTo<DynamicObject>(args[1 ]);
66
77
78
+ if (!JavascriptOperators::OP_HasProperty (memoryDescriptor, PropertyIds::initial, scriptContext))
79
+ {
80
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_NeedNumber, _u (" descriptor.initial" ));
81
+ }
67
82
Var initVar = JavascriptOperators::OP_GetProperty (memoryDescriptor, PropertyIds::initial, scriptContext);
68
83
uint32 initial = WebAssembly::ToNonWrappingUint32 (initVar, scriptContext);
69
84
@@ -271,10 +286,7 @@ WebAssemblyMemory::EntryGetterBuffer(RecyclableObject* function, CallInfo callIn
271
286
WebAssemblyMemory *
272
287
WebAssemblyMemory::CreateMemoryObject (uint32 initial, uint32 maximum, bool isShared, ScriptContext * scriptContext)
273
288
{
274
- if (!AreLimitsValid (initial, maximum))
275
- {
276
- JavascriptError::ThrowRangeError (scriptContext, JSERR_ArgumentOutOfRange);
277
- }
289
+ CheckLimits (scriptContext, initial, maximum);
278
290
uint32 byteLength = UInt32Math::Mul<WebAssembly::PageSize>(initial);
279
291
ArrayBufferBase* buffer = nullptr ;
280
292
#ifdef ENABLE_WASM_THREADS
@@ -300,10 +312,7 @@ WebAssemblyMemory::CreateMemoryObject(uint32 initial, uint32 maximum, bool isSha
300
312
301
313
WebAssemblyMemory * WebAssemblyMemory::CreateForExistingBuffer (uint32 initial, uint32 maximum, uint32 currentByteLength, ScriptContext * scriptContext)
302
314
{
303
- if (!AreLimitsValid (initial, maximum, currentByteLength))
304
- {
305
- JavascriptError::ThrowRangeError (scriptContext, JSERR_ArgumentOutOfRange);
306
- }
315
+ CheckLimits (scriptContext, initial, maximum, currentByteLength);
307
316
ArrayBufferBase* buffer = scriptContext->GetLibrary ()->CreateWebAssemblyArrayBuffer (currentByteLength);
308
317
Assert (buffer);
309
318
if (currentByteLength > 0 && buffer->GetByteLength () == 0 )
@@ -317,10 +326,11 @@ WebAssemblyMemory * WebAssemblyMemory::CreateForExistingBuffer(uint32 initial, u
317
326
#ifdef ENABLE_WASM_THREADS
318
327
WebAssemblyMemory * WebAssemblyMemory::CreateFromSharedContents (uint32 initial, uint32 maximum, SharedContents* sharedContents, ScriptContext * scriptContext)
319
328
{
320
- if (!sharedContents || ! AreLimitsValid (initial, maximum, sharedContents-> bufferLength ) )
329
+ if (!sharedContents)
321
330
{
322
- JavascriptError::ThrowRangeError (scriptContext, JSERR_ArgumentOutOfRange );
331
+ JavascriptError::ThrowTypeError (scriptContext, JSERR_FunctionArgument_Invalid );
323
332
}
333
+ CheckLimits (scriptContext, initial, maximum, sharedContents->bufferLength );
324
334
ArrayBufferBase* buffer = scriptContext->GetLibrary ()->CreateWebAssemblySharedArrayBuffer (sharedContents);
325
335
return RecyclerNewFinalized (scriptContext->GetRecycler (), WebAssemblyMemory, buffer, initial, maximum, scriptContext->GetLibrary ()->GetWebAssemblyMemoryType ());
326
336
}
0 commit comments