diff options
| author | Adrian Prantl <aprantl@apple.com> | 2022-11-14 16:24:36 -0800 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2022-11-16 15:51:26 -0800 |
| commit | 6eaedbb52f2a616e644e5acc7279c8b07c4cfe82 (patch) | |
| tree | 4fe3af14033dc99c540bbeec32c4d1f9a3f3e120 /lldb/source/Core/DumpDataExtractor.cpp | |
| parent | 0fcb26c5b6487bf9b31670122f8c931ac020bb34 (diff) | |
Make CompilerType safe
When a process gets restarted TypeSystem objects associated with it
may get deleted, and any CompilerType objects holding on to a
reference to that type system are a use-after-free in waiting. Because
of the SBAPI, we don't have tight control over where CompilerTypes go
and when they are used. This is particularly a problem in the Swift
plugin, where the scratch TypeSystem can be restarted while the
process is still running. The Swift plugin has a lock to prevent
abuse, but where there's a lock there can be bugs.
This patch changes CompilerType to store a std::weak_ptr<TypeSystem>.
Most of the std::weak_ptr<TypeSystem>* uglyness is hidden by
introducing a wrapper class CompilerType::WrappedTypeSystem that has a
dyn_cast_or_null() method. The only sites that need to know about the
weak pointer implementation detail are the ones that deal with
creating TypeSystems.
rdar://101505232
Differential Revision: https://reviews.llvm.org/D136650
Diffstat (limited to 'lldb/source/Core/DumpDataExtractor.cpp')
| -rw-r--r-- | lldb/source/Core/DumpDataExtractor.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lldb/source/Core/DumpDataExtractor.cpp b/lldb/source/Core/DumpDataExtractor.cpp index 0bf6722340fe..ec98d6266241 100644 --- a/lldb/source/Core/DumpDataExtractor.cpp +++ b/lldb/source/Core/DumpDataExtractor.cpp @@ -320,11 +320,12 @@ printMemoryTags(const DataExtractor &DE, Stream *s, lldb::addr_t addr, static const llvm::fltSemantics &GetFloatSemantics(const TargetSP &target_sp, size_t byte_size) { if (target_sp) { - if (auto type_system_or_err = - target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC)) - return type_system_or_err->GetFloatTypeSemantics(byte_size); - else + auto type_system_or_err = + target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC); + if (!type_system_or_err) llvm::consumeError(type_system_or_err.takeError()); + else if (auto ts = *type_system_or_err) + return ts->GetFloatTypeSemantics(byte_size); } // No target, just make a reasonable guess switch(byte_size) { |
