Skip to content

Commit

Permalink
[CVE-2018-8286] [ChakraCore] Edge - Chakra Type Confusion - Internal
Browse files Browse the repository at this point in the history
  • Loading branch information
Meghana Gupta authored and Atul Katti committed Jul 10, 2018
1 parent 4196f80 commit 0ac4253
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
8 changes: 4 additions & 4 deletions lib/Backend/GlobOpt.h
Original file line number Diff line number Diff line change
Expand Up @@ -849,15 +849,15 @@ class GlobOpt
static void TrackByteCodeSymUsed(IR::Opnd * opnd, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed, PropertySym **pPropertySymUse);
static void TrackByteCodeSymUsed(IR::RegOpnd * opnd, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
static void TrackByteCodeSymUsed(StackSym * sym, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
void CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo);
void CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo, BVSparse<JitArenaAllocator>* argsToCapture);
void CaptureValuesFromScratch(
BasicBlock * block,
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter, SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter,
BVSparse<JitArenaAllocator>* argsToCapture);
void CaptureValuesIncremental(
BasicBlock * block,
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter, BVSparse<JitArenaAllocator>* argsToCapture);
void CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter);
void CaptureArguments(BasicBlock *block, BailOutInfo * bailOutInfo, JitArenaAllocator *allocator);
void CaptureByteCodeSymUses(IR::Instr * instr);
Expand Down
33 changes: 26 additions & 7 deletions lib/Backend/GlobOptBailOut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ GlobOpt::CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListB
void
GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
BVSparse<JitArenaAllocator>* argsToCapture)
{
Sym * sym = nullptr;
Value * value = nullptr;
Expand All @@ -49,6 +50,11 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
}
NEXT_GLOBHASHTABLE_ENTRY;

if (argsToCapture)
{
block->globOptData.changedSyms->Or(argsToCapture);
}

FOREACH_BITSET_IN_SPARSEBV(symId, block->globOptData.changedSyms)
{
HashBucket<Sym*, Value*> * bucket = block->globOptData.symToValueMap->GetBucket(symId);
Expand Down Expand Up @@ -80,7 +86,8 @@ GlobOpt::CaptureValuesFromScratch(BasicBlock * block,
void
GlobOpt::CaptureValuesIncremental(BasicBlock * block,
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter)
SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter,
BVSparse<JitArenaAllocator>* argsToCapture)
{
CapturedValues * currCapturedValues = block->globOptData.capturedValues;
SListBase<ConstantStackSymValue>::Iterator iterConst(currCapturedValues ? &currCapturedValues->constantValues : nullptr);
Expand All @@ -90,6 +97,11 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,

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

if (argsToCapture)
{
block->globOptData.changedSyms->Or(argsToCapture);
}

FOREACH_BITSET_IN_SPARSEBV(symId, block->globOptData.changedSyms)
{
Value * val = nullptr;
Expand Down Expand Up @@ -225,7 +237,7 @@ GlobOpt::CaptureValuesIncremental(BasicBlock * block,


void
GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo)
GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo, BVSparse<JitArenaAllocator>* argsToCapture)
{
if (!this->func->DoGlobOptsForGeneratorFunc())
{
Expand All @@ -244,11 +256,11 @@ GlobOpt::CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo)

if (!block->globOptData.capturedValues)
{
CaptureValuesFromScratch(block, bailOutConstValuesIter, bailOutCopySymsIter);
CaptureValuesFromScratch(block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture);
}
else
{
CaptureValuesIncremental(block, bailOutConstValuesIter, bailOutCopySymsIter);
CaptureValuesIncremental(block, bailOutConstValuesIter, bailOutCopySymsIter, argsToCapture);
}

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

BVSparse<JitArenaAllocator>* argsToCapture = nullptr;

bailOutInfo->liveVarSyms = block->globOptData.liveVarSyms->CopyNew(this->func->m_alloc);
bailOutInfo->liveFloat64Syms = block->globOptData.liveFloat64Syms->CopyNew(this->func->m_alloc);
// The live int32 syms in the bailout info are only the syms resulting from lossless conversion to int. If the int32 value
Expand Down Expand Up @@ -971,7 +985,12 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
sym = opnd->GetStackSym();
Assert(this->currentBlock->globOptData.FindValue(sym));
// StackSym args need to be re-captured
this->currentBlock->globOptData.SetChangedSym(sym->m_id);
if (!argsToCapture)
{
argsToCapture = JitAnew(this->tempAlloc, BVSparse<JitArenaAllocator>, this->tempAlloc);
}

argsToCapture->Set(sym->m_id);
}

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

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

void
Expand Down

0 comments on commit 0ac4253

Please sign in to comment.