Skip to content

Commit f2947c8

Browse files
authored
Merge pull request swiftlang#4522 from slavapestov/remote-sanity-check
Remote: Sanity check number of elements in existential and tuple
2 parents 60ce7f5 + 3fdf978 commit f2947c8

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

include/swift/Remote/MetadataReader.h

+15-6
Original file line numberDiff line numberDiff line change
@@ -931,7 +931,7 @@ class MetadataReader {
931931
// This is ABI.
932932
static constexpr auto OffsetToName =
933933
roundUpToAlignment(size_t(12), sizeof(StoredPointer))
934-
+ sizeof(StoredPointer);;
934+
+ sizeof(StoredPointer);
935935

936936
// Read the name pointer.
937937
StoredPointer namePtr;
@@ -963,15 +963,19 @@ class MetadataReader {
963963
return _readMetadata<TargetEnumMetadata>(address);
964964
case MetadataKind::Existential: {
965965
StoredPointer numProtocolsAddress = address +
966-
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
966+
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
967967
StoredPointer numProtocols;
968968
if (!Reader->readInteger(RemoteAddress(numProtocolsAddress),
969969
&numProtocols))
970970
return nullptr;
971971

972+
// Make sure the number of protocols is reasonable
973+
if (numProtocols >= 256)
974+
return nullptr;
975+
972976
auto totalSize = sizeof(TargetExistentialTypeMetadata<Runtime>)
973-
+ numProtocols *
974-
sizeof(ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
977+
+ numProtocols *
978+
sizeof(ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
975979

976980
return _readMetadata(address, totalSize);
977981
}
@@ -997,13 +1001,18 @@ class MetadataReader {
9971001
return _readMetadata<TargetStructMetadata>(address);
9981002
case MetadataKind::Tuple: {
9991003
auto numElementsAddress = address +
1000-
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
1004+
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
10011005
StoredSize numElements;
10021006
if (!Reader->readInteger(RemoteAddress(numElementsAddress),
10031007
&numElements))
10041008
return nullptr;
10051009
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+
10071016
return _readMetadata(address, totalSize);
10081017
}
10091018
}

0 commit comments

Comments
 (0)