From 821a802c402e40a0f8a141b05515521e274f72a9 Mon Sep 17 00:00:00 2001 From: Dave Lee Date: Mon, 31 Jan 2022 19:55:06 -0800 Subject: [PATCH 1/2] [lldb] Unlock Swift scratch context before early return (cherry picked from commit 32fa0939a878d4b88a3609abafdb97f646144ae4) --- lldb/source/Target/Target.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 6096764c57d7c..b1e1570f63e12 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2319,8 +2319,10 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, m_scratch_type_system_map.RemoveTypeSystemsForLanguage(language); type_system_or_err = m_scratch_type_system_map.GetTypeSystemForLanguage( language, this, create_on_demand, compiler_options); - if (!type_system_or_err) + if (!type_system_or_err) { + GetSwiftScratchContextLock().unlock(); return type_system_or_err.takeError(); + } if (auto *new_swift_ast_ctx = llvm::dyn_cast_or_null( From b0435fdcfb03bb037e672a531d6f97df83efdc77 Mon Sep 17 00:00:00 2001 From: Dave Lee Date: Tue, 1 Feb 2022 10:33:16 -0800 Subject: [PATCH 2/2] use make_scope_exit (cherry picked from commit 2911abea1e8342823b3c2eefdbb1849e1b4446e1) --- lldb/source/Target/Target.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index b1e1570f63e12..bf37e9efc947e 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2296,6 +2296,9 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, // thread) is holding a read lock to the scratch context and // replacing it could cause a use-after-free later on. if (GetSwiftScratchContextLock().try_lock()) { + auto unlock = llvm::make_scope_exit([this] { + GetSwiftScratchContextLock().unlock(); + }); if (m_use_scratch_typesystem_per_module) DisplayFallbackSwiftContextErrors(swift_ast_ctx); else if (StreamSP errs = GetDebugger().GetAsyncErrorStream()) { @@ -2319,10 +2322,8 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, m_scratch_type_system_map.RemoveTypeSystemsForLanguage(language); type_system_or_err = m_scratch_type_system_map.GetTypeSystemForLanguage( language, this, create_on_demand, compiler_options); - if (!type_system_or_err) { - GetSwiftScratchContextLock().unlock(); + if (!type_system_or_err) return type_system_or_err.takeError(); - } if (auto *new_swift_ast_ctx = llvm::dyn_cast_or_null( @@ -2347,7 +2348,6 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, llvm::make_error("DIAF", llvm::inconvertibleErrorCode()); } } - GetSwiftScratchContextLock().unlock(); } } } else if (create_on_demand) {