Skip to content

Commit efab310

Browse files
MikeHolmanatulkatti
authored andcommitted
[CVE-2019-1103] Chakra JIT Type Confusion
1 parent ba1f445 commit efab310

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

lib/Backend/BackwardPass.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -4151,13 +4151,17 @@ BackwardPass::UpdateImplicitCallBailOutKind(IR::Instr *const instr, bool needsBa
41514151

41524152
IR::BailOutKind implicitCallBailOutKind = needsBailOutOnImplicitCall ? IR::BailOutOnImplicitCalls : IR::BailOutInvalid;
41534153

4154-
const IR::BailOutKind instrBailOutKind = instr->GetBailOutKind();
4154+
IR::BailOutKind instrBailOutKind = instr->GetBailOutKind();
41554155
if (instrBailOutKind & IR::BailOutMarkTempObject)
41564156
{
4157-
// Don't remove the implicit call pre op bailout for mark temp object
41584157
// Remove the mark temp object bit, as we don't need it after the dead store pass
4159-
instr->SetBailOutKind(instrBailOutKind & ~IR::BailOutMarkTempObject);
4160-
return true;
4158+
instrBailOutKind &= ~IR::BailOutMarkTempObject;
4159+
instr->SetBailOutKind(instrBailOutKind);
4160+
4161+
if (!instr->GetBailOutInfo()->canDeadStore)
4162+
{
4163+
return true;
4164+
}
41614165
}
41624166

41634167
const IR::BailOutKind instrImplicitCallBailOutKind = instrBailOutKind & ~IR::BailOutKindBits;

lib/Backend/BailOut.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class BailOutInfo
2727
BailOutInfo(uint32 bailOutOffset, Func* bailOutFunc) :
2828
bailOutOffset(bailOutOffset), bailOutFunc(bailOutFunc),
2929
byteCodeUpwardExposedUsed(nullptr), polymorphicCacheIndex((uint)-1), startCallCount(0), startCallInfo(nullptr), bailOutInstr(nullptr),
30-
totalOutParamCount(0), argOutSyms(nullptr), bailOutRecord(nullptr), wasCloned(false), isInvertedBranch(false), sharedBailOutKind(true), isLoopTopBailOutInfo(false),
30+
totalOutParamCount(0), argOutSyms(nullptr), bailOutRecord(nullptr), wasCloned(false), isInvertedBranch(false), sharedBailOutKind(true), isLoopTopBailOutInfo(false), canDeadStore(true),
3131
outParamInlinedArgSlot(nullptr), liveVarSyms(nullptr), liveLosslessInt32Syms(nullptr), liveFloat64Syms(nullptr),
3232
branchConditionOpnd(nullptr),
3333
stackLiteralBailOutInfoCount(0), stackLiteralBailOutInfo(nullptr)
@@ -69,6 +69,7 @@ class BailOutInfo
6969
#endif
7070
bool wasCloned;
7171
bool isInvertedBranch;
72+
bool canDeadStore;
7273
bool sharedBailOutKind;
7374
bool isLoopTopBailOutInfo;
7475

lib/Backend/GlobOpt.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -16531,6 +16531,7 @@ GlobOpt::GenerateBailOutMarkTempObjectIfNeeded(IR::Instr * instr, IR::Opnd * opn
1653116531
if (instr->HasBailOutInfo())
1653216532
{
1653316533
instr->SetBailOutKind(instr->GetBailOutKind() | IR::BailOutMarkTempObject);
16534+
instr->GetBailOutInfo()->canDeadStore = false;
1653416535
}
1653516536
else
1653616537
{
@@ -16540,6 +16541,11 @@ GlobOpt::GenerateBailOutMarkTempObjectIfNeeded(IR::Instr * instr, IR::Opnd * opn
1654016541
|| (instr->m_opcode == Js::OpCode::FromVar && !opnd->GetValueType().IsPrimitive())
1654116542
|| propertySymOpnd == nullptr
1654216543
|| !propertySymOpnd->IsTypeCheckProtected())
16544+
{
16545+
this->GenerateBailAtOperation(&instr, IR::BailOutMarkTempObject);
16546+
instr->GetBailOutInfo()->canDeadStore = false;
16547+
}
16548+
else if (propertySymOpnd->MayHaveImplicitCall())
1654316549
{
1654416550
this->GenerateBailAtOperation(&instr, IR::BailOutMarkTempObject);
1654516551
}

lib/Backend/Opnd.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,8 @@ class PropertySymOpnd sealed : public SymOpnd
11381138
// fall back on live cache. Similarly, for fixed method checks.
11391139
bool MayHaveImplicitCall() const
11401140
{
1141-
return !IsRootObjectNonConfigurableFieldLoad() && !UsesFixedValue() && (!IsTypeCheckSeqCandidate() || !IsTypeCheckProtected());
1141+
return !IsRootObjectNonConfigurableFieldLoad() && !UsesFixedValue() && (!IsTypeCheckSeqCandidate() || !IsTypeCheckProtected()
1142+
|| (IsLoadedFromProto() && NeedsWriteGuardTypeCheck()));
11421143
}
11431144

11441145
// Is the instruction involving this operand part of a type check sequence? This is different from IsObjTypeSpecOptimized

0 commit comments

Comments
 (0)