Skip to content

Commit 8fa4de1

Browse files
committed
[Reflection] Prevent type reference manlging induced creash
1 parent 71fb04a commit 8fa4de1

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ class TypeRefBuilder {
630630
private:
631631
std::vector<ReflectionInfo> ReflectionInfos;
632632

633-
std::string normalizeReflectionName(RemoteRef<char> name);
633+
llvm::Optional<std::string> normalizeReflectionName(RemoteRef<char> name);
634634
bool reflectionNameMatches(RemoteRef<char> reflectionName,
635635
StringRef searchName);
636636

@@ -654,7 +654,7 @@ class TypeRefBuilder {
654654
// TypeRefBuilder struct, to isolate its template-ness from the rest of
655655
// TypeRefBuilder.
656656
unsigned PointerSize;
657-
std::function<Demangle::Node * (RemoteRef<char>)>
657+
std::function<Demangle::Node * (RemoteRef<char>, bool)>
658658
TypeRefDemangler;
659659
std::function<const TypeRef* (uint64_t, unsigned)>
660660
OpaqueUnderlyingTypeReader;
@@ -665,10 +665,10 @@ class TypeRefBuilder {
665665
: TC(*this),
666666
PointerSize(sizeof(typename Runtime::StoredPointer)),
667667
TypeRefDemangler(
668-
[this, &reader](RemoteRef<char> string) -> Demangle::Node * {
668+
[this, &reader](RemoteRef<char> string, bool useOpaqueTypeSymbolicReferences) -> Demangle::Node * {
669669
return reader.demangle(string,
670670
remote::MangledNameKind::Type,
671-
Dem, /*useOpaqueTypeSymbolicReferences*/ true);
671+
Dem, useOpaqueTypeSymbolicReferences);
672672
}),
673673
OpaqueUnderlyingTypeReader(
674674
[&reader](uint64_t descriptorAddr, unsigned ordinal) -> const TypeRef* {
@@ -677,8 +677,9 @@ class TypeRefBuilder {
677677
})
678678
{}
679679

680-
Demangle::Node *demangleTypeRef(RemoteRef<char> string) {
681-
return TypeRefDemangler(string);
680+
Demangle::Node *demangleTypeRef(RemoteRef<char> string,
681+
bool useOpaqueTypeSymbolicReferences = true) {
682+
return TypeRefDemangler(string, useOpaqueTypeSymbolicReferences);
682683
}
683684

684685
TypeConverter &getTypeConverter() { return TC; }

stdlib/public/Reflection/TypeRefBuilder.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,22 @@ RemoteRef<char> TypeRefBuilder::readTypeRef(uint64_t remoteAddr) {
8484
}
8585

8686
/// Load and normalize a mangled name so it can be matched with string equality.
87-
std::string
87+
llvm::Optional<std::string>
8888
TypeRefBuilder::normalizeReflectionName(RemoteRef<char> reflectionName) {
8989
// Remangle the reflection name to resolve symbolic references.
90-
if (auto node = demangleTypeRef(reflectionName)) {
91-
auto result = mangleNode(node);
92-
clearNodeFactory();
93-
return result;
90+
if (auto node = demangleTypeRef(reflectionName,
91+
/*useOpaqueTypeSymbolicReferences*/ false)) {
92+
switch (node->getKind()) {
93+
case Node::Kind::TypeSymbolicReference:
94+
case Node::Kind::ProtocolSymbolicReference:
95+
case Node::Kind::OpaqueTypeDescriptorSymbolicReference:
96+
// Symbolic references cannot be mangled, return a failure.
97+
return {};
98+
default:
99+
auto result = mangleNode(node);
100+
clearNodeFactory();
101+
return result;
102+
}
94103
}
95104

96105
// Fall back to the raw string.
@@ -102,7 +111,9 @@ bool
102111
TypeRefBuilder::reflectionNameMatches(RemoteRef<char> reflectionName,
103112
StringRef searchName) {
104113
auto normalized = normalizeReflectionName(reflectionName);
105-
return searchName.equals(normalized);
114+
if (!normalized)
115+
return false;
116+
return searchName.equals(*normalized);
106117
}
107118

108119
const TypeRef * TypeRefBuilder::
@@ -194,8 +205,8 @@ TypeRefBuilder::getFieldTypeInfo(const TypeRef *TR) {
194205
if (!FD->hasMangledTypeName())
195206
continue;
196207
auto CandidateMangledName = readTypeRef(FD, FD->MangledTypeName);
197-
auto NormalizedName = normalizeReflectionName(CandidateMangledName);
198-
FieldTypeInfoCache[NormalizedName] = FD;
208+
if (auto NormalizedName = normalizeReflectionName(CandidateMangledName))
209+
FieldTypeInfoCache[*NormalizedName] = FD;
199210
}
200211
}
201212

0 commit comments

Comments
 (0)