Skip to content

Commit f88eb20

Browse files
committed
stdlib: Make _typeByName Foundation SPI reject symbolic references.
It's used for recovering type metadata from deserialized mangled names, which should never have symbolic references in them.
1 parent d0a4978 commit f88eb20

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

stdlib/public/core/Misc.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,17 @@ public // SPI(Foundation)
8484
func _typeByName(_ name: String) -> Any.Type? {
8585
let nameUTF8 = Array(name.utf8)
8686
return nameUTF8.withUnsafeBufferPointer { (nameUTF8) in
87-
return _getTypeByMangledName(nameUTF8.baseAddress!,
88-
UInt(nameUTF8.endIndex),
89-
genericEnvironment: nil,
90-
genericArguments: nil)
87+
return _getTypeByMangledNameUntrusted(nameUTF8.baseAddress!,
88+
UInt(nameUTF8.endIndex))
9189
}
9290
}
9391

92+
@_silgen_name("swift_stdlib_getTypeByMangledNameUntrusted")
93+
internal func _getTypeByMangledNameUntrusted(
94+
_ name: UnsafePointer<UInt8>,
95+
_ nameLength: UInt)
96+
-> Any.Type?
97+
9498
@_silgen_name("swift_getTypeByMangledNameInEnvironment")
9599
internal func _getTypeByMangledName(
96100
_ name: UnsafePointer<UInt8>,

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,6 +1301,23 @@ swift_getTypeByMangledNameInContext(
13011301
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
13021302
}
13031303

1304+
/// Demangle a mangled name, but don't allow symbolic references.
1305+
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL
1306+
const Metadata *_Nullable
1307+
swift_stdlib_getTypeByMangledNameUntrusted(const char *typeNameStart,
1308+
size_t typeNameLength) {
1309+
llvm::StringRef typeName(typeNameStart, typeNameLength);
1310+
for (char c : typeName) {
1311+
if (c >= '\x01' && c <= '\x1F')
1312+
return nullptr;
1313+
}
1314+
1315+
auto metadata = swift_getTypeByMangledName(typeName, {}, {});
1316+
if (!metadata) return nullptr;
1317+
1318+
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
1319+
}
1320+
13041321
#if SWIFT_OBJC_INTEROP
13051322

13061323
// Return the ObjC class for the given type name.

0 commit comments

Comments
 (0)