Skip to content

Commit c8abc36

Browse files
pleathleirocks
authored andcommitted
[CVE-2018-8236] Virtual typed array buffer read/written after free
1 parent 9b270c5 commit c8abc36

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12746,6 +12746,8 @@ GlobOpt::DoTrackNewValueForKills(Value *const value)
1274612746
const bool isJsArray = valueInfo->IsArrayOrObjectWithArray();
1274712747
Assert(!isJsArray == valueInfo->IsOptimizedTypedArray());
1274812748

12749+
const bool isVirtualTypedArray = valueInfo->IsOptimizedVirtualTypedArray();
12750+
1274912751
Loop *implicitCallsLoop;
1275012752
if(currentBlock->next && !currentBlock->next->isDeleted && currentBlock->next->isLoopHeader)
1275112753
{
@@ -12760,7 +12762,7 @@ GlobOpt::DoTrackNewValueForKills(Value *const value)
1276012762
implicitCallsLoop = currentBlock->loop;
1276112763
}
1276212764

12763-
if(isJsArray)
12765+
if(isJsArray || isVirtualTypedArray)
1276412766
{
1276512767
if(!DoArrayCheckHoist(valueInfo->Type(), implicitCallsLoop))
1276612768
{
@@ -12779,7 +12781,7 @@ GlobOpt::DoTrackNewValueForKills(Value *const value)
1277912781
VerifyArrayValueInfoForTracking(valueInfo, isJsArray, currentBlock);
1278012782
#endif
1278112783

12782-
if(!isJsArray)
12784+
if(!isJsArray && !isVirtualTypedArray)
1278312785
{
1278412786
return;
1278512787
}
@@ -12815,11 +12817,13 @@ GlobOpt::DoTrackCopiedValueForKills(Value *const value)
1281512817
const bool isJsArray = valueInfo->IsArrayOrObjectWithArray();
1281612818
Assert(!isJsArray == valueInfo->IsOptimizedTypedArray());
1281712819

12820+
const bool isVirtualTypedArray = valueInfo->IsOptimizedVirtualTypedArray();
12821+
1281812822
#if DBG
1281912823
VerifyArrayValueInfoForTracking(valueInfo, isJsArray, currentBlock);
1282012824
#endif
1282112825

12822-
if(!isJsArray && !(valueInfo->IsArrayValueInfo() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym()))
12826+
if(!isJsArray && !isVirtualTypedArray && !(valueInfo->IsArrayValueInfo() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym()))
1282312827
{
1282412828
return;
1282512829
}
@@ -12862,11 +12866,13 @@ GlobOpt::DoTrackMergedValueForKills(
1286212866
const bool isJsArray = valueInfo->IsArrayOrObjectWithArray();
1286312867
Assert(!isJsArray == valueInfo->IsOptimizedTypedArray());
1286412868

12869+
const bool isVirtualTypedArray = valueInfo->IsOptimizedVirtualTypedArray();
12870+
1286512871
#if DBG
1286612872
VerifyArrayValueInfoForTracking(valueInfo, isJsArray, currentBlock, true);
1286712873
#endif
1286812874

12869-
if(!isJsArray && !(valueInfo->IsArrayValueInfo() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym()))
12875+
if(!isJsArray && !isVirtualTypedArray && !(valueInfo->IsArrayValueInfo() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym()))
1287012876
{
1287112877
return;
1287212878
}
@@ -12899,6 +12905,7 @@ GlobOpt::TrackValueInfoChangeForKills(BasicBlock *const block, Value *const valu
1289912905

1290012906
const bool trackOldValueInfo =
1290112907
oldValueInfo->IsArrayOrObjectWithArray() ||
12908+
oldValueInfo->IsOptimizedVirtualTypedArray() ||
1290212909
(
1290312910
oldValueInfo->IsOptimizedTypedArray() &&
1290412911
oldValueInfo->IsArrayValueInfo() &&
@@ -12915,6 +12922,7 @@ GlobOpt::TrackValueInfoChangeForKills(BasicBlock *const block, Value *const valu
1291512922

1291612923
const bool trackNewValueInfo =
1291712924
newValueInfo->IsArrayOrObjectWithArray() ||
12925+
newValueInfo->IsOptimizedVirtualTypedArray() ||
1291812926
(
1291912927
newValueInfo->IsOptimizedTypedArray() &&
1292012928
newValueInfo->IsArrayValueInfo() &&
@@ -12983,6 +12991,7 @@ GlobOpt::ProcessValueKills(IR::Instr *const instr)
1298312991
ValueInfo *const valueInfo = value->GetValueInfo();
1298412992
Assert(
1298512993
valueInfo->IsArrayOrObjectWithArray() ||
12994+
valueInfo->IsOptimizedVirtualTypedArray() ||
1298612995
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
1298712996
if (valueInfo->IsArrayOrObjectWithArray() || valueInfo->IsOptimizedVirtualTypedArray())
1298812997
{
@@ -13008,6 +13017,7 @@ GlobOpt::ProcessValueKills(IR::Instr *const instr)
1300813017
ValueInfo *const valueInfo = value->GetValueInfo();
1300913018
Assert(
1301013019
valueInfo->IsArrayOrObjectWithArray() ||
13020+
valueInfo->IsOptimizedVirtualTypedArray() ||
1301113021
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
1301213022
if(!valueInfo->IsArrayOrObjectWithArray() || !valueInfo->HasNoMissingValues())
1301313023
{
@@ -13028,6 +13038,7 @@ GlobOpt::ProcessValueKills(IR::Instr *const instr)
1302813038
ValueInfo *const valueInfo = value->GetValueInfo();
1302913039
Assert(
1303013040
valueInfo->IsArrayOrObjectWithArray() ||
13041+
valueInfo->IsOptimizedVirtualTypedArray() ||
1303113042
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
1303213043
if(!valueInfo->IsArrayOrObjectWithArray() || valueInfo->HasVarElements())
1303313044
{
@@ -13054,6 +13065,7 @@ GlobOpt::ProcessValueKills(IR::Instr *const instr)
1305413065
ValueInfo *valueInfo = value->GetValueInfo();
1305513066
Assert(
1305613067
valueInfo->IsArrayOrObjectWithArray() ||
13068+
valueInfo->IsOptimizedVirtualTypedArray() ||
1305713069
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
1305813070
if(!valueInfo->IsArrayOrObjectWithArray())
1305913071
{
@@ -13129,8 +13141,9 @@ GlobOpt::ProcessValueKills(BasicBlock *const block, GlobOptBlockData *const bloc
1312913141
ValueInfo *const valueInfo = value->GetValueInfo();
1313013142
Assert(
1313113143
valueInfo->IsArrayOrObjectWithArray() ||
13144+
valueInfo->IsOptimizedVirtualTypedArray() ||
1313213145
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
13133-
if(valueInfo->IsArrayOrObjectWithArray())
13146+
if(valueInfo->IsArrayOrObjectWithArray() || valueInfo->IsOptimizedVirtualTypedArray())
1313413147
{
1313513148
ChangeValueType(nullptr, value, valueInfo->Type().ToLikely(), false);
1313613149
continue;
@@ -13163,18 +13176,21 @@ GlobOpt::ProcessValueKillsForLoopHeaderAfterBackEdgeMerge(BasicBlock *const bloc
1316313176
ValueInfo *valueInfo = value->GetValueInfo();
1316413177
Assert(
1316513178
valueInfo->IsArrayOrObjectWithArray() ||
13179+
valueInfo->IsOptimizedVirtualTypedArray() ||
1316613180
valueInfo->IsOptimizedTypedArray() && valueInfo->AsArrayValueInfo()->HeadSegmentLengthSym());
1316713181

1316813182
const bool isJsArray = valueInfo->IsArrayOrObjectWithArray();
1316913183
Assert(!isJsArray == valueInfo->IsOptimizedTypedArray());
1317013184

13171-
if(isJsArray ? loopKills.KillsValueType(valueInfo->Type()) : loopKills.KillsTypedArrayHeadSegmentLengths())
13185+
const bool isVirtualTypedArray = valueInfo->IsOptimizedVirtualTypedArray();
13186+
13187+
if((isJsArray || isVirtualTypedArray) ? loopKills.KillsValueType(valueInfo->Type()) : loopKills.KillsTypedArrayHeadSegmentLengths())
1317213188
{
1317313189
// Hoisting array checks and other related things for this type is disabled for the loop due to the kill, as
1317413190
// compensation code is currently not added on back-edges. When merging values from a back-edge, the array value
1317513191
// type cannot be definite, as that may require adding compensation code on the back-edge if the optimization pass
1317613192
// chooses to not optimize the array.
13177-
if(isJsArray)
13193+
if(isJsArray || isVirtualTypedArray)
1317813194
{
1317913195
ChangeValueType(nullptr, value, valueInfo->Type().ToLikely(), false);
1318013196
}

0 commit comments

Comments
 (0)