File tree Expand file tree Collapse file tree 2 files changed +25
-4
lines changed Expand file tree Collapse file tree 2 files changed +25
-4
lines changed Original file line number Diff line number Diff line change @@ -84,13 +84,17 @@ public // SPI(Foundation)
84
84
func _typeByName( _ name: String ) -> Any . Type ? {
85
85
let nameUTF8 = Array ( name. utf8)
86
86
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) )
91
89
}
92
90
}
93
91
92
+ @_silgen_name ( " swift_stdlib_getTypeByMangledNameUntrusted " )
93
+ internal func _getTypeByMangledNameUntrusted(
94
+ _ name: UnsafePointer < UInt8 > ,
95
+ _ nameLength: UInt )
96
+ -> Any . Type ?
97
+
94
98
@_silgen_name ( " swift_getTypeByMangledNameInEnvironment " )
95
99
internal func _getTypeByMangledName(
96
100
_ name: UnsafePointer < UInt8 > ,
Original file line number Diff line number Diff line change @@ -1301,6 +1301,23 @@ swift_getTypeByMangledNameInContext(
1301
1301
return swift_checkMetadataState (MetadataState::Complete, metadata).Value ;
1302
1302
}
1303
1303
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
+
1304
1321
#if SWIFT_OBJC_INTEROP
1305
1322
1306
1323
// Return the ObjC class for the given type name.
You can’t perform that action at this time.
0 commit comments