Skip to content

Commit 0ac4253

Browse files
Meghana GuptaAtul Katti
Meghana Gupta
authored and
Atul Katti
committed
[CVE-2018-8286] [ChakraCore] Edge - Chakra Type Confusion - Internal
1 parent 4196f80 commit 0ac4253

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

lib/Backend/GlobOpt.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -849,15 +849,15 @@ class GlobOpt
849849
static void TrackByteCodeSymUsed(IR::Opnd * opnd, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed, PropertySym **pPropertySymUse);
850850
static void TrackByteCodeSymUsed(IR::RegOpnd * opnd, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
851851
static void TrackByteCodeSymUsed(StackSym * sym, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
852-
void CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo);
852+
void CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo, BVSparse<JitArenaAllocator>* argsToCapture);
853853
void CaptureValuesFromScratch(
854854
BasicBlock * block,
855-
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
856-
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
855+
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter, SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter,
856+
BVSparse<JitArenaAllocator>* argsToCapture);
857857
void CaptureValuesIncremental(
858858
BasicBlock * block,
859859
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
860-
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
860+
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter, BVSparse<JitArenaAllocator>* argsToCapture);
861861
void CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter);
862862
void CaptureArguments(BasicBlock *block, BailOutInfo * bailOutInfo, JitArenaAllocator *allocator);
863863
void CaptureByteCodeSymUses(IR::Instr * instr);

lib/Backend/GlobOptBailOut.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ GlobOpt::CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListB
2222
void
2323
GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
2424
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
25-
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
25+
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
26+
BVSparse<JitArenaAllocator>* argsToCapture)
2627
{
2728
Sym * sym = nullptr;
2829
Value * value = nullptr;
@@ -49,6 +50,11 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
4950
}
5051
NEXT_GLOBHASHTABLE_ENTRY;
5152

53+
if (argsToCapture)
54+
{
55+
block->globOptData.changedSyms->Or(argsToCapture);
56+
}
57+
5258
FOREACH_BITSET_IN_SPARSEBV(symId, block->globOptData.changedSyms)
5359
{
5460
HashBucket<Sym*, Value*> * bucket = block->globOptData.symToValueMap->GetBucket(symId);
@@ -80,7 +86,8 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
8086
void
8187
GlobOpt::CaptureValuesIncremental(BasicBlock * block,
8288
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
83-
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
89+
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
90+
BVSparse<JitArenaAllocator>* argsToCapture)
8491
{
8592
CapturedValues * currCapturedValues = block->globOptData.capturedValues;
8693
SListBase<ConstantStackSymValue>::Iterator iterConst(currCapturedValues ? &currCapturedValues->constantValues : nullptr);
@@ -90,6 +97,11 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
9097

9198
block->globOptData.changedSyms->Set(Js::Constants::InvalidSymID);
9299

100+
if (argsToCapture)
101+
{
102+
block->globOptData.changedSyms->Or(argsToCapture);
103+
}
104+
93105
FOREACH_BITSET_IN_SPARSEBV(symId, block->globOptData.changedSyms)
94106
{
95107
Value * val = nullptr;
@@ -225,7 +237,7 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,
225237

226238

227239
void
228-
GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo)
240+
GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo, BVSparse<JitArenaAllocator>* argsToCapture)
229241
{
230242
if (!this->func->DoGlobOptsForGeneratorFunc())
231243
{
@@ -244,11 +256,11 @@ GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo)
244256

245257
if (!block->globOptData.capturedValues)
246258
{
247-
CaptureValuesFromScratch(block, bailOutConstValuesIter, bailOutCopySymsIter);
259+
CaptureValuesFromScratch(block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture);
248260
}
249261
else
250262
{
251-
CaptureValuesIncremental(block, bailOutConstValuesIter, bailOutCopySymsIter);
263+
CaptureValuesIncremental(block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture);
252264
}
253265

254266
// attach capturedValues to bailOutInfo
@@ -892,6 +904,8 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
892904
{
893905
AssertMsg(!this->isCallHelper, "Bail out can't be inserted the middle of CallHelper sequence");
894906

907+
BVSparse<JitArenaAllocator>* argsToCapture = nullptr;
908+
895909
bailOutInfo->liveVarSyms = block->globOptData.liveVarSyms->CopyNew(this->func->m_alloc);
896910
bailOutInfo->liveFloat64Syms = block->globOptData.liveFloat64Syms->CopyNew(this->func->m_alloc);
897911
// The live int32 syms in the bailout info are only the syms resulting from lossless conversion to int. If the int32 value
@@ -971,7 +985,12 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
971985
sym = opnd->GetStackSym();
972986
Assert(this->currentBlock->globOptData.FindValue(sym));
973987
// StackSym args need to be re-captured
974-
this->currentBlock->globOptData.SetChangedSym(sym->m_id);
988+
if (!argsToCapture)
989+
{
990+
argsToCapture = JitAnew(this->tempAlloc, BVSparse<JitArenaAllocator>, this->tempAlloc);
991+
}
992+
993+
argsToCapture->Set(sym->m_id);
975994
}
976995

977996
Assert(totalOutParamCount != 0);
@@ -1019,7 +1038,7 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
10191038

10201039
// Save the constant values that we know so we can restore them directly.
10211040
// This allows us to dead store the constant value assign.
1022-
this->CaptureValues(block, bailOutInfo);
1041+
this->CaptureValues(block, bailOutInfo, argsToCapture);
10231042
}
10241043

10251044
void

0 commit comments

Comments
 (0)