Skip to content

Commit f8aa306

Browse files
rajatdThomas Moore (CHAKRA)
authored andcommitted
[CVE-2018-8511] Edge - UAF of LdFld instruction in GlobOpt::prePassInstrMap, freed by path dependent branch folding - Internal
1 parent 08f11df commit f8aa306

File tree

2 files changed

+13
-41
lines changed

2 files changed

+13
-41
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,28 +1013,17 @@ BOOL GlobOpt::PRE::PreloadPRECandidate(Loop *loop, GlobHashBucket* candidate)
10131013
// Create instr to put in landing pad for compensation
10141014
Assert(IsPREInstrCandidateLoad(ldInstrInLoop->m_opcode));
10151015

1016-
IR::Instr * ldInstr = InsertPropertySymPreloadWithoutDstInLandingPad(ldInstrInLoop, loop, propertySym);
1016+
IR::Instr * ldInstr = InsertPropertySymPreloadInLandingPad(ldInstrInLoop, loop, propertySym);
10171017
if (!ldInstr)
10181018
{
10191019
return false;
10201020
}
10211021

10221022
Assert(ldInstr->GetDst() == nullptr);
1023-
if (ldInstrInLoop->GetDst())
1024-
{
1025-
Assert(ldInstrInLoop->GetDst()->IsRegOpnd());
1026-
if (ldInstrInLoop->GetDst()->AsRegOpnd()->m_sym != symStore)
1027-
{
1028-
ldInstr->SetDst(IR::RegOpnd::New(symStore->AsStackSym(), TyVar, this->globOpt->func));
1029-
loop->fieldPRESymStores->Set(symStore->m_id);
1030-
}
1031-
else
1032-
{
1033-
ldInstr->SetDst(ldInstrInLoop->GetDst()->Copy(ldInstrInLoop->m_func));
1034-
}
1035-
landingPad->globOptData.liveVarSyms->Set(ldInstr->GetDst()->AsRegOpnd()->m_sym->m_id);
1036-
}
1037-
1023+
ldInstr->SetDst(IR::RegOpnd::New(symStore->AsStackSym(), TyVar, this->globOpt->func));
1024+
loop->fieldPRESymStores->Set(symStore->m_id);
1025+
landingPad->globOptData.liveVarSyms->Set(symStore->m_id);
1026+
10381027
Value * objPtrValue = landingPad->globOptData.FindValue(objPtrSym);
10391028

10401029
objPtrCopyPropSym = objPtrCopyPropSym ? objPtrCopyPropSym : objPtrValue ? landingPad->globOptData.GetCopyPropSym(objPtrSym, objPtrValue) : nullptr;
@@ -3310,7 +3299,7 @@ GlobOpt::OptSrc(IR::Opnd *opnd, IR::Instr * *pInstr, Value **indirIndexValRef, I
33103299
// Can this be done in one call?
33113300
if (!this->prePassInstrMap->ContainsKey(sym->m_id))
33123301
{
3313-
this->prePassInstrMap->AddNew(sym->m_id, instr);
3302+
this->prePassInstrMap->AddNew(sym->m_id, instr->CopyWithoutDst());
33143303
}
33153304
}
33163305
}
@@ -17235,7 +17224,7 @@ GlobOpt::PRE::InsertSymDefinitionInLandingPad(StackSym * sym, Loop * loop, Sym *
1723517224
// #1 is done next. #2 and #3 are done as part of preloading T1.y
1723617225

1723717226
// Insert T1 = o.x
17238-
if (!InsertPropertySymPreloadInLandingPad(symDefInstr, loop, propSym))
17227+
if (!InsertPropertySymPreloadInLandingPad(symDefInstr->Copy(), loop, propSym))
1723917228
{
1724017229
return false;
1724117230
}
@@ -17248,7 +17237,7 @@ GlobOpt::PRE::InsertSymDefinitionInLandingPad(StackSym * sym, Loop * loop, Sym *
1724817237
if (loop->landingPad->globOptData.IsLive(*objPtrCopyPropSym))
1724917238
{
1725017239
// insert T1 = o.x
17251-
if (!InsertPropertySymPreloadInLandingPad(symDefInstr, loop, propSym))
17240+
if (!InsertPropertySymPreloadInLandingPad(symDefInstr->Copy(), loop, propSym))
1725217241
{
1725317242
return false;
1725417243
}
@@ -17336,25 +17325,6 @@ GlobOpt::PRE::InsertInstrInLandingPad(IR::Instr * instr, Loop * loop)
1733617325

1733717326
IR::Instr *
1733817327
GlobOpt::PRE::InsertPropertySymPreloadInLandingPad(IR::Instr * ldInstr, Loop * loop, PropertySym * propertySym)
17339-
{
17340-
IR::Instr * instr = InsertPropertySymPreloadWithoutDstInLandingPad(ldInstr, loop, propertySym);
17341-
if (!instr)
17342-
{
17343-
return nullptr;
17344-
}
17345-
17346-
if (ldInstr->GetDst())
17347-
{
17348-
instr->SetDst(ldInstr->GetDst()->Copy(ldInstr->m_func));
17349-
instr->GetDst()->SetIsJITOptimizedReg(true);
17350-
loop->landingPad->globOptData.liveVarSyms->Set(instr->GetDst()->GetStackSym()->m_id);
17351-
}
17352-
17353-
return instr;
17354-
}
17355-
17356-
IR::Instr *
17357-
GlobOpt::PRE::InsertPropertySymPreloadWithoutDstInLandingPad(IR::Instr * ldInstr, Loop * loop, PropertySym * propertySym)
1735817328
{
1735917329
IR::SymOpnd *ldSrc = ldInstr->GetSrc1()->AsSymOpnd();
1736017330

@@ -17369,8 +17339,6 @@ GlobOpt::PRE::InsertPropertySymPreloadWithoutDstInLandingPad(IR::Instr * ldInstr
1736917339
}
1737017340
}
1737117341

17372-
ldInstr = ldInstr->CopyWithoutDst();
17373-
1737417342
// Consider: Shouldn't be necessary once we have copy-prop in prepass...
1737517343
ldInstr->GetSrc1()->AsSymOpnd()->m_sym = propertySym;
1737617344
ldSrc = ldInstr->GetSrc1()->AsSymOpnd();
@@ -17384,6 +17352,11 @@ GlobOpt::PRE::InsertPropertySymPreloadWithoutDstInLandingPad(IR::Instr * ldInstr
1738417352
ldInstr->ReplaceSrc1(newPropSymOpnd);
1738517353
}
1738617354

17355+
if (ldInstr->GetDst())
17356+
{
17357+
loop->landingPad->globOptData.liveVarSyms->Set(ldInstr->GetDst()->GetStackSym()->m_id);
17358+
}
17359+
1738717360
InsertInstrInLandingPad(ldInstr, loop);
1738817361

1738917362
return ldInstr;

lib/Backend/GlobOpt.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,6 @@ class GlobOpt::PRE
10291029
void FindPossiblePRECandidates(Loop *loop, JitArenaAllocator *alloc);
10301030
void PreloadPRECandidates(Loop *loop);
10311031
BOOL PreloadPRECandidate(Loop *loop, GlobHashBucket* candidate);
1032-
IR::Instr * InsertPropertySymPreloadWithoutDstInLandingPad(IR::Instr * origLdInstr, Loop * loop, PropertySym * propertySym);
10331032
IR::Instr * InsertPropertySymPreloadInLandingPad(IR::Instr * origLdInstr, Loop * loop, PropertySym * propertySym);
10341033
void InsertInstrInLandingPad(IR::Instr * instr, Loop * loop);
10351034
bool InsertSymDefinitionInLandingPad(StackSym * sym, Loop * loop, Sym ** objPtrCopyPropSym);

0 commit comments

Comments
 (0)