Skip to content

Commit f223d0b

Browse files
committed
[Runtime] Eliminate a use-after-free when comparing @objc type names.
We were creating a local Demangler instance, demangling a type name using it, and then returning one of the resulting nodes to the caller. Fixes rdar://problem/46817009.
1 parent 4cdfa7e commit f223d0b

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,13 @@ _findNominalTypeDescriptor(Demangle::NodePointer node,
231231
/// Find the context descriptor for the type extended by the given extension.
232232
static const ContextDescriptor *
233233
_findExtendedTypeContextDescriptor(const ExtensionContextDescriptor *extension,
234+
Demangler &demangler,
234235
Demangle::NodePointer *demangledNode
235236
= nullptr) {
236237
Demangle::NodePointer localNode;
237238
Demangle::NodePointer &node = demangledNode ? *demangledNode : localNode;
238239

239240
auto mangledName = extension->getMangledExtendedContext();
240-
auto demangler = getDemanglerForRuntimeTypeResolution();
241241
node = demangler.demangleType(mangledName);
242242
if (!node)
243243
return nullptr;
@@ -423,7 +423,7 @@ swift::_contextDescriptorMatchesMangling(const ContextDescriptor *context,
423423

424424
Demangle::NodePointer extendedContextDemangled;
425425
auto extendedDescriptorFromDemangled =
426-
_findExtendedTypeContextDescriptor(extension,
426+
_findExtendedTypeContextDescriptor(extension, demangler,
427427
&extendedContextDemangled);
428428

429429
// Determine whether the contexts match.
@@ -822,8 +822,10 @@ bool swift::_gatherGenericParameterCounts(
822822
std::vector<unsigned> &genericParamCounts) {
823823
// If we have an extension descriptor, extract the extended type and use
824824
// that.
825+
auto demangler = getDemanglerForRuntimeTypeResolution();
825826
if (auto extension = dyn_cast<ExtensionContextDescriptor>(descriptor)) {
826-
if (auto extendedType = _findExtendedTypeContextDescriptor(extension))
827+
if (auto extendedType =
828+
_findExtendedTypeContextDescriptor(extension, demangler))
827829
descriptor = extendedType;
828830
}
829831

test/Runtime/demangleToMetadataObjC.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ DemangleToMetadataTests.test("synthesized declarations") {
9292
}
9393

9494
DemangleToMetadataTests.test("members of runtime-only Objective-C classes") {
95+
expectNotNil(_typeByName("So17OS_dispatch_queueC8DispatchE10AttributesV"))
9596
expectEqual(DispatchQueue.Attributes.self,
9697
_typeByName("So17OS_dispatch_queueC8DispatchE10AttributesV")!)
9798
}

0 commit comments

Comments
 (0)