Skip to content

Commit fc9892c

Browse files
Meghana GuptaMikeHolman
authored andcommitted
[CVE-2019-0651] Chakracore Tianfucup IRBuilder::BuildAuxiliary Type Confusion - 360Vulcan
1 parent bdd22d1 commit fc9892c

File tree

1 file changed

+44
-27
lines changed

1 file changed

+44
-27
lines changed

lib/Runtime/Library/JavascriptArray.cpp

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -982,14 +982,13 @@ using namespace Js;
982982
Var JavascriptArray::OP_NewScIntArray(AuxArray<int32> *ints, ScriptContext* scriptContext)
983983
{
984984
JIT_HELPER_NOT_REENTRANT_HEADER(ScrArr_OP_NewScIntArray, reentrancylock, scriptContext->GetThreadContext());
985-
uint32 count = ints->count;
986-
JavascriptArray *arr = scriptContext->GetLibrary()->CreateArrayLiteral(count);
987-
SparseArraySegment<Var> *head = SparseArraySegment<Var>::From(arr->head);
988-
Assert(count > 0 && count == head->length);
989-
for (uint i = 0; i < count; i++)
990-
{
991-
head->elements[i] = JavascriptNumber::ToVar(ints->elements[i], scriptContext);
992-
}
985+
986+
JavascriptNativeIntArray *arr = scriptContext->GetLibrary()->CreateNativeIntArrayLiteral(ints->count);
987+
988+
SparseArraySegment<int32> * segment = (SparseArraySegment<int32>*)arr->GetHead();
989+
990+
JavascriptOperators::AddIntsToArraySegment(segment, ints);
991+
993992
return arr;
994993
JIT_HELPER_END(ScrArr_OP_NewScIntArray);
995994
}
@@ -1042,31 +1041,30 @@ using namespace Js;
10421041
return arr;
10431042
}
10441043

1045-
return OP_NewScIntArray(ints, scriptContext);
1044+
JavascriptArray *arr = scriptContext->GetLibrary()->CreateArrayLiteral(count);
1045+
SparseArraySegment<Var> *head = SparseArraySegment<Var>::From(arr->head);
1046+
Assert(count > 0 && count == head->length);
1047+
1048+
for (uint i = 0; i < count; i++)
1049+
{
1050+
head->elements[i] = JavascriptNumber::ToVar(ints->elements[i], scriptContext);
1051+
}
1052+
1053+
return arr;
10461054
JIT_HELPER_END(ScrArr_ProfiledNewScIntArray);
10471055
}
10481056
#endif
10491057

10501058
Var JavascriptArray::OP_NewScFltArray(AuxArray<double> *doubles, ScriptContext* scriptContext)
10511059
{
10521060
JIT_HELPER_NOT_REENTRANT_HEADER(ScrArr_OP_NewScFltArray, reentrancylock, scriptContext->GetThreadContext());
1053-
uint32 count = doubles->count;
1054-
JavascriptArray *arr = scriptContext->GetLibrary()->CreateArrayLiteral(count);
1055-
SparseArraySegment<Var> *head = SparseArraySegment<Var>::From(arr->head);
1056-
Assert(count > 0 && count == head->length);
1057-
for (uint i = 0; i < count; i++)
1058-
{
1059-
double dval = doubles->elements[i];
1060-
int32 ival;
1061-
if (JavascriptNumber::TryGetInt32Value(dval, &ival) && !TaggedInt::IsOverflow(ival))
1062-
{
1063-
head->elements[i] = TaggedInt::ToVarUnchecked(ival);
1064-
}
1065-
else
1066-
{
1067-
head->elements[i] = JavascriptNumber::ToVarNoCheck(dval, scriptContext);
1068-
}
1069-
}
1061+
1062+
JavascriptNativeFloatArray *arr = scriptContext->GetLibrary()->CreateNativeFloatArrayLiteral(doubles->count);
1063+
1064+
SparseArraySegment<double> * segment = (SparseArraySegment<double>*)arr->GetHead();
1065+
1066+
JavascriptOperators::AddFloatsToArraySegment(segment, doubles);
1067+
10701068
return arr;
10711069
JIT_HELPER_END(ScrArr_OP_NewScFltArray);
10721070
}
@@ -1089,7 +1087,26 @@ using namespace Js;
10891087
return arr;
10901088
}
10911089

1092-
return OP_NewScFltArray(doubles, scriptContext);
1090+
uint32 count = doubles->count;
1091+
JavascriptArray *arr = scriptContext->GetLibrary()->CreateArrayLiteral(count);
1092+
SparseArraySegment<Var> *head = SparseArraySegment<Var>::From(arr->head);
1093+
Assert(count > 0 && count == head->length);
1094+
1095+
for (uint i = 0; i < count; i++)
1096+
{
1097+
double dval = doubles->elements[i];
1098+
int32 ival;
1099+
if (JavascriptNumber::TryGetInt32Value(dval, &ival) && !TaggedInt::IsOverflow(ival))
1100+
{
1101+
head->elements[i] = TaggedInt::ToVarUnchecked(ival);
1102+
}
1103+
else
1104+
{
1105+
head->elements[i] = JavascriptNumber::ToVarNoCheck(dval, scriptContext);
1106+
}
1107+
}
1108+
1109+
return arr;
10931110
JIT_HELPER_END(ScrArr_ProfiledNewScFltArray);
10941111
}
10951112

0 commit comments

Comments
 (0)