Skip to content

Commit 8b229ce

Browse files
pleathakroshg
authored andcommitted
[CVE-2018-0872] edge Array buffer UAF vulnerability
1 parent 069c3fb commit 8b229ce

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13443,6 +13443,9 @@ GlobOpt::OptArraySrc(IR::Instr * *const instrRef)
1344313443
return;
1344413444
}
1344513445

13446+
const bool isLikelyVirtualTypedArray = baseValueType.IsLikelyOptimizedVirtualTypedArray();
13447+
Assert(!(isLikelyJsArray && isLikelyVirtualTypedArray));
13448+
1344613449
ValueType newBaseValueType(baseValueType.ToDefiniteObject());
1344713450
if(isLikelyJsArray && newBaseValueType.HasNoMissingValues() && !DoArrayMissingValueCheckHoist())
1344813451
{
@@ -13773,7 +13776,7 @@ GlobOpt::OptArraySrc(IR::Instr * *const instrRef)
1377313776
{
1377413777
const JsArrayKills loopKills(loop->jsArrayKills);
1377513778
Value *baseValueInLoopLandingPad = nullptr;
13776-
if((isLikelyJsArray && loopKills.KillsValueType(newBaseValueType)) ||
13779+
if(((isLikelyJsArray || isLikelyVirtualTypedArray) && loopKills.KillsValueType(newBaseValueType)) ||
1377713780
!OptIsInvariant(baseOpnd->m_sym, currentBlock, loop, baseValue, true, true, &baseValueInLoopLandingPad) ||
1377813781
!(doArrayChecks || baseValueInLoopLandingPad->GetValueInfo()->IsObject()))
1377913782
{
@@ -17387,7 +17390,9 @@ GlobOpt::DoArrayCheckHoist(const ValueType baseValueType, Loop* loop, IR::Instr
1738717390
return false;
1738817391
}
1738917392

17390-
if(!baseValueType.IsLikelyArrayOrObjectWithArray() ||
17393+
// This includes typed arrays, but not virtual typed arrays, whose vtable can change if the buffer goes away.
17394+
// Note that in the virtual case the vtable check is the only way to catch this, since there's no bound check.
17395+
if(!(baseValueType.IsLikelyArrayOrObjectWithArray() || baseValueType.IsLikelyOptimizedVirtualTypedArray()) ||
1739117396
(loop ? ImplicitCallFlagsAllowOpts(loop) : ImplicitCallFlagsAllowOpts(func)))
1739217397
{
1739317398
return true;

lib/Backend/GlobOpt.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,12 +332,16 @@ class JsArrayKills
332332
public:
333333
bool KillsValueType(const ValueType valueType) const
334334
{
335-
Assert(valueType.IsArrayOrObjectWithArray());
335+
Assert(valueType.IsArrayOrObjectWithArray() || valueType.IsOptimizedVirtualTypedArray());
336336

337337
return
338338
killsAllArrays ||
339-
(killsArraysWithNoMissingValues && valueType.HasNoMissingValues()) ||
340-
(killsNativeArrays && !valueType.HasVarElements());
339+
(valueType.IsArrayOrObjectWithArray() &&
340+
(
341+
(killsArraysWithNoMissingValues && valueType.HasNoMissingValues()) ||
342+
(killsNativeArrays && !valueType.HasVarElements())
343+
)
344+
);
341345
}
342346

343347
bool AreSubsetOf(const JsArrayKills &other) const

0 commit comments

Comments
 (0)