Skip to content

Commit 13b88b9

Browse files
committed
WebAssembly.Memory: Do not call HasProperty to check if a property is present in the descriptor
Check for NaN and Infinity for NonWrapping uint32 values
1 parent f46d3d9 commit 13b88b9

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

lib/Runtime/Library/WebAssembly.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,18 @@ Var WebAssembly::TryResolveResponse(RecyclableObject* function, Var thisArg, Var
288288
uint32
289289
WebAssembly::ToNonWrappingUint32(Var val, ScriptContext * ctx)
290290
{
291-
double i = JavascriptConversion::ToInteger(val, ctx);
292-
if (i < 0 || i > (double)UINT32_MAX)
291+
double i = JavascriptConversion::ToNumber(val, ctx);
292+
if (
293+
JavascriptNumber::IsNan(i) ||
294+
JavascriptNumber::IsPosInf(i) ||
295+
JavascriptNumber::IsNegInf(i) ||
296+
i < 0 ||
297+
i > (double)UINT32_MAX
298+
)
293299
{
294-
JavascriptError::ThrowRangeError(ctx, JSERR_ArgumentOutOfRange);
300+
JavascriptError::ThrowTypeError(ctx, JSERR_NeedNumber);
295301
}
296-
return (uint32)i;
302+
return (uint32)JavascriptConversion::ToInteger(i);
297303
}
298304

299305
void

lib/Runtime/Library/WebAssemblyMemory.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,31 +75,34 @@ WebAssemblyMemory::NewInstance(RecyclableObject* function, CallInfo callInfo, ..
7575
}
7676
DynamicObject * memoryDescriptor = VarTo<DynamicObject>(args[1]);
7777

78-
if (!JavascriptOperators::OP_HasProperty(memoryDescriptor, PropertyIds::initial, scriptContext))
78+
Var initVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::initial, scriptContext);
79+
if (Js::JavascriptOperators::IsUndefined(initVar))
7980
{
8081
JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, _u("descriptor.initial"));
8182
}
82-
Var initVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::initial, scriptContext);
8383
uint32 initial = WebAssembly::ToNonWrappingUint32(initVar, scriptContext);
8484

8585
uint32 maximum = Wasm::Limits::GetMaxMemoryMaximumPages();
8686
bool hasMaximum = false;
87-
if (JavascriptOperators::OP_HasProperty(memoryDescriptor, PropertyIds::maximum, scriptContext))
87+
Var maxVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::maximum, scriptContext);
88+
if (!Js::JavascriptOperators::IsUndefined(maxVar))
8889
{
8990
hasMaximum = true;
90-
Var maxVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::maximum, scriptContext);
9191
maximum = WebAssembly::ToNonWrappingUint32(maxVar, scriptContext);
9292
}
9393

9494
bool isShared = false;
95-
if (Wasm::Threads::IsEnabled() && JavascriptOperators::OP_HasProperty(memoryDescriptor, PropertyIds::shared, scriptContext))
95+
if (Wasm::Threads::IsEnabled())
9696
{
97-
if (!hasMaximum)
97+
Var sharedVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::shared, scriptContext);
98+
if (!Js::JavascriptOperators::IsUndefined(sharedVar))
9899
{
99-
JavascriptError::ThrowTypeError(scriptContext, WASMERR_SharedNoMaximum);
100+
isShared = JavascriptConversion::ToBool(sharedVar, scriptContext);
101+
if (!hasMaximum)
102+
{
103+
JavascriptError::ThrowTypeError(scriptContext, WASMERR_SharedNoMaximum);
104+
}
100105
}
101-
Var sharedVar = JavascriptOperators::OP_GetProperty(memoryDescriptor, PropertyIds::shared, scriptContext);
102-
isShared = JavascriptConversion::ToBool(sharedVar, scriptContext);
103106
}
104107

105108
return CreateMemoryObject(initial, maximum, isShared, scriptContext);

0 commit comments

Comments
 (0)