Skip to content

Commit aca4447

Browse files
authored
Merge pull request #61707 from mikeash/readmangledname-string-lifetime
[Reflection] Fix premature deallocation of string memory in readMangledName.
2 parents ae4ad5d + 494d570 commit aca4447

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

include/swift/Remote/MetadataReader.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,20 @@ class MetadataReader {
506506
return result;
507507
}
508508

509+
/// Demangle a mangled name from a potentially temporary std::string. The
510+
/// demangler may produce pointers into the string data, so this copies the
511+
/// string into the demangler's allocation first.
512+
Demangle::NodePointer demangle(uint64_t remoteAddress,
513+
const std::string &mangledName,
514+
MangledNameKind kind,
515+
Demangler &dem) {
516+
size_t stringSize = mangledName.size() + 1; // + 1 for terminating NUL.
517+
518+
char *copiedString = dem.Allocate<char>(stringSize);
519+
memcpy(copiedString, mangledName.data(), stringSize);
520+
return demangle(RemoteRef<char>(remoteAddress, copiedString), kind, dem);
521+
}
522+
509523
/// Given a demangle tree, attempt to turn it into a type.
510524
TypeLookupErrorOr<typename BuilderType::BuiltType>
511525
decodeMangledType(NodePointer Node) {
@@ -2344,10 +2358,7 @@ class MetadataReader {
23442358
// We're done.
23452359
break;
23462360
}
2347-
2348-
return demangle(RemoteRef<char>(address.getAddressData(),
2349-
mangledName.data()),
2350-
kind, dem);
2361+
return demangle(address.getAddressData(), mangledName, kind, dem);
23512362
}
23522363

23532364
/// Read and demangle the name of an anonymous context.

0 commit comments

Comments
 (0)