Skip to content

Commit 69a259c

Browse files
rajatdakroshg
authored andcommitted
CVE-2018-8629 OOB bug in Edge WIP
1 parent 5db4218 commit 69a259c

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

lib/Backend/FlowGraph.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5266,7 +5266,7 @@ BasicBlock::MergePredBlocksValueMaps(GlobOpt* globOpt)
52665266
}
52675267
if(symsRequiringCompensationToMergedValueInfoMap.Count() != 0)
52685268
{
5269-
globOpt->InsertValueCompensation(pred, symsRequiringCompensationToMergedValueInfoMap);
5269+
globOpt->InsertValueCompensation(pred, &symsRequiringCompensationToMergedValueInfoMap);
52705270
}
52715271
}
52725272
} NEXT_PREDECESSOR_EDGE_EDITING;
@@ -5325,6 +5325,12 @@ BasicBlock::MergePredBlocksValueMaps(GlobOpt* globOpt)
53255325
loop->liveFieldsOnEntry = JitAnew(globOpt->alloc, BVSparse<JitArenaAllocator>, globOpt->alloc);
53265326
loop->liveFieldsOnEntry->Copy(this->globOptData.liveFields);
53275327

5328+
if (symsRequiringCompensationToMergedValueInfoMap.Count() != 0)
5329+
{
5330+
loop->symsRequiringCompensationToMergedValueInfoMap = JitAnew(globOpt->alloc, SymToValueInfoMap, globOpt->alloc);
5331+
loop->symsRequiringCompensationToMergedValueInfoMap->Copy(&symsRequiringCompensationToMergedValueInfoMap);
5332+
}
5333+
53285334
if(globOpt->DoBoundCheckHoist() && loop->inductionVariables)
53295335
{
53305336
globOpt->FinalizeInductionVariables(loop, &blockData);

lib/Backend/FlowGraph.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,7 @@ class Loop
575575
BVSparse<JitArenaAllocator> *lossyInt32SymsOnEntry; // see GlobOptData::liveLossyInt32Syms
576576
BVSparse<JitArenaAllocator> *float64SymsOnEntry;
577577
BVSparse<JitArenaAllocator> *liveFieldsOnEntry;
578+
SymToValueInfoMap *symsRequiringCompensationToMergedValueInfoMap;
578579

579580
BVSparse<JitArenaAllocator> *symsUsedBeforeDefined; // stack syms that are live in the landing pad, and used before they are defined in the loop
580581
BVSparse<JitArenaAllocator> *likelyIntSymsUsedBeforeDefined; // stack syms that are live in the landing pad with a likely-int value, and used before they are defined in the loop
@@ -742,7 +743,8 @@ class Loop
742743
allFieldsKilled(false),
743744
isLeaf(true),
744745
isProcessed(false),
745-
initialValueFieldMap(alloc)
746+
initialValueFieldMap(alloc),
747+
symsRequiringCompensationToMergedValueInfoMap(nullptr)
746748
{
747749
this->loopNumber = ++func->loopCount;
748750
}

lib/Backend/GlobOpt.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,11 @@ GlobOpt::OptBlock(BasicBlock *block)
599599
this->tempBv->And(liveOnBackEdge);
600600
this->ToFloat64(this->tempBv, block->loop->landingPad);
601601

602+
if (block->loop->symsRequiringCompensationToMergedValueInfoMap)
603+
{
604+
InsertValueCompensation(block, block->loop->symsRequiringCompensationToMergedValueInfoMap);
605+
}
606+
602607
// Now that we're done with the liveFields within this loop, trim the set to those syms
603608
// that the backward pass told us were live out of the loop.
604609
// This assumes we have no further need of the liveFields within the loop.
@@ -1151,10 +1156,10 @@ void GlobOpt::FieldPRE(Loop *loop)
11511156

11521157
void GlobOpt::InsertValueCompensation(
11531158
BasicBlock *const predecessor,
1154-
const SymToValueInfoMap &symsRequiringCompensationToMergedValueInfoMap)
1159+
const SymToValueInfoMap *symsRequiringCompensationToMergedValueInfoMap)
11551160
{
11561161
Assert(predecessor);
1157-
Assert(symsRequiringCompensationToMergedValueInfoMap.Count() != 0);
1162+
Assert(symsRequiringCompensationToMergedValueInfoMap->Count() != 0);
11581163

11591164
IR::Instr *insertBeforeInstr = predecessor->GetLastInstr();
11601165
Func *const func = insertBeforeInstr->m_func;
@@ -1193,7 +1198,7 @@ void GlobOpt::InsertValueCompensation(
11931198
}
11941199
};
11951200
JsUtil::List<DelayChangeValueInfo, ArenaAllocator> delayChangeValueInfo(alloc);
1196-
for(auto it = symsRequiringCompensationToMergedValueInfoMap.GetIterator(); it.IsValid(); it.MoveNext())
1201+
for(auto it = symsRequiringCompensationToMergedValueInfoMap->GetIterator(); it.IsValid(); it.MoveNext())
11971202
{
11981203
const auto &entry = it.Current();
11991204
Sym *const sym = entry.Key();

lib/Backend/GlobOpt.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ class GlobOpt
737737
void PreLowerCanonicalize(IR::Instr *instr, Value **pSrc1Val, Value **pSrc2Val);
738738
void ProcessKills(IR::Instr *instr);
739739
void InsertCloneStrs(BasicBlock *toBlock, GlobOptBlockData *toData, GlobOptBlockData *fromData);
740-
void InsertValueCompensation(BasicBlock *const predecessor, const SymToValueInfoMap &symsRequiringCompensationToMergedValueInfoMap);
740+
void InsertValueCompensation(BasicBlock *const predecessor, const SymToValueInfoMap *symsRequiringCompensationToMergedValueInfoMap);
741741
IR::Instr * ToVarUses(IR::Instr *instr, IR::Opnd *opnd, bool isDst, Value *val);
742742
void ToVar(BVSparse<JitArenaAllocator> *bv, BasicBlock *block);
743743
IR::Instr * ToVar(IR::Instr *instr, IR::RegOpnd *regOpnd, BasicBlock *block, Value *val, bool needsUpdate);

0 commit comments

Comments
 (0)