@@ -931,7 +931,7 @@ class MetadataReader {
931
931
// This is ABI.
932
932
static constexpr auto OffsetToName =
933
933
roundUpToAlignment (size_t (12 ), sizeof (StoredPointer))
934
- + sizeof (StoredPointer); ;
934
+ + sizeof (StoredPointer);
935
935
936
936
// Read the name pointer.
937
937
StoredPointer namePtr;
@@ -963,15 +963,19 @@ class MetadataReader {
963
963
return _readMetadata<TargetEnumMetadata>(address);
964
964
case MetadataKind::Existential: {
965
965
StoredPointer numProtocolsAddress = address +
966
- TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
966
+ TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
967
967
StoredPointer numProtocols;
968
968
if (!Reader->readInteger (RemoteAddress (numProtocolsAddress),
969
969
&numProtocols))
970
970
return nullptr ;
971
971
972
+ // Make sure the number of protocols is reasonable
973
+ if (numProtocols >= 256 )
974
+ return nullptr ;
975
+
972
976
auto totalSize = sizeof (TargetExistentialTypeMetadata<Runtime>)
973
- + numProtocols *
974
- sizeof (ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
977
+ + numProtocols *
978
+ sizeof (ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
975
979
976
980
return _readMetadata (address, totalSize);
977
981
}
@@ -997,13 +1001,18 @@ class MetadataReader {
997
1001
return _readMetadata<TargetStructMetadata>(address);
998
1002
case MetadataKind::Tuple: {
999
1003
auto numElementsAddress = address +
1000
- TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
1004
+ TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
1001
1005
StoredSize numElements;
1002
1006
if (!Reader->readInteger (RemoteAddress (numElementsAddress),
1003
1007
&numElements))
1004
1008
return nullptr ;
1005
1009
auto totalSize = sizeof (TargetTupleTypeMetadata<Runtime>)
1006
- + numElements * sizeof (StoredPointer);
1010
+ + numElements * sizeof (StoredPointer);
1011
+
1012
+ // Make sure the number of elements is reasonable
1013
+ if (numElements >= 256 )
1014
+ return nullptr ;
1015
+
1007
1016
return _readMetadata (address, totalSize);
1008
1017
}
1009
1018
}
0 commit comments