Skip to content

Commit d4e767f

Browse files
MikeHolmanatulkatti
authored andcommitted
[CVE-2019-1092] Chakra JIT OOB R/W
1 parent 362e965 commit d4e767f

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

lib/Backend/GlobOptBlockData.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -974,7 +974,8 @@ GlobOptBlockData::MergeValueInfo(
974974
fromDataValueInfo->AsArrayValueInfo(),
975975
fromDataSym,
976976
symsRequiringCompensation,
977-
symsCreatedForMerge);
977+
symsCreatedForMerge,
978+
isLoopBackEdge);
978979
}
979980

980981
// Consider: If both values are VarConstantValueInfo with the same value, we could
@@ -1072,7 +1073,8 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
10721073
const ArrayValueInfo *const fromDataValueInfo,
10731074
Sym *const arraySym,
10741075
BVSparse<JitArenaAllocator> *const symsRequiringCompensation,
1075-
BVSparse<JitArenaAllocator> *const symsCreatedForMerge)
1076+
BVSparse<JitArenaAllocator> *const symsCreatedForMerge,
1077+
bool isLoopBackEdge)
10761078
{
10771079
Assert(mergedValueType.IsAnyOptimizedArray());
10781080
Assert(toDataValueInfo);
@@ -1095,7 +1097,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
10951097
}
10961098
else
10971099
{
1098-
if (!this->globOpt->IsLoopPrePass())
1100+
if (!this->globOpt->IsLoopPrePass() && !isLoopBackEdge)
10991101
{
11001102
// Adding compensation code in the prepass won't help, as the symstores would again be different in the main pass.
11011103
Assert(symsRequiringCompensation);
@@ -1123,7 +1125,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
11231125
}
11241126
else
11251127
{
1126-
if (!this->globOpt->IsLoopPrePass())
1128+
if (!this->globOpt->IsLoopPrePass() && !isLoopBackEdge)
11271129
{
11281130
Assert(symsRequiringCompensation);
11291131
symsRequiringCompensation->Set(arraySym->m_id);
@@ -1150,7 +1152,7 @@ ValueInfo *GlobOptBlockData::MergeArrayValueInfo(
11501152
}
11511153
else
11521154
{
1153-
if (!this->globOpt->IsLoopPrePass())
1155+
if (!this->globOpt->IsLoopPrePass() && !isLoopBackEdge)
11541156
{
11551157
Assert(symsRequiringCompensation);
11561158
symsRequiringCompensation->Set(arraySym->m_id);

lib/Backend/GlobOptBlockData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ class GlobOptBlockData
264264
Value * MergeValues(Value *toDataValue, Value *fromDataValue, Sym *fromDataSym, bool isLoopBackEdge, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
265265
ValueInfo * MergeValueInfo(Value *toDataVal, Value *fromDataVal, Sym *fromDataSym, bool isLoopBackEdge, bool sameValueNumber, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
266266
JsTypeValueInfo * MergeJsTypeValueInfo(JsTypeValueInfo * toValueInfo, JsTypeValueInfo * fromValueInfo, bool isLoopBackEdge, bool sameValueNumber);
267-
ValueInfo * MergeArrayValueInfo(const ValueType mergedValueType, const ArrayValueInfo *const toDataValueInfo, const ArrayValueInfo *const fromDataValueInfo, Sym *const arraySym, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge);
267+
ValueInfo * MergeArrayValueInfo(const ValueType mergedValueType, const ArrayValueInfo *const toDataValueInfo, const ArrayValueInfo *const fromDataValueInfo, Sym *const arraySym, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge, bool isLoopBackEdge);
268268

269269
// Argument Tracking
270270
public:

0 commit comments

Comments
 (0)