Skip to content

Commit 5033f07

Browse files
committed
[lldb] Avoid unhandled Error in TypeSystemMap::GetTypeSystemForLanguage
When assertions are turned off, the `llvm::Error` value created at the start of this function is overwritten using the move-assignment operator, but the success value is never checked. Whenever a TypeSystem cannot be found or created, this can lead to lldb core dumping with: Program aborted due to an unhandled Error: Error value was Success. (Note: Success values must still be checked prior to being destroyed). Fix this by not creating a `llvm::Error` value in advance, and directly returning the result of `llvm::make_error` instead, whenever an error is encountered. See also: <https://bugs.freebsd.org/253881> and <https://bugs.freebsd.org/257829>. Reviewed By: teemperor Differential Revision: https://reviews.llvm.org/D108088
1 parent d6fe8d3 commit 5033f07

File tree

1 file changed

+38
-52
lines changed

1 file changed

+38
-52
lines changed

lldb/source/Symbol/TypeSystem.cpp

Lines changed: 38 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -223,70 +223,56 @@ void TypeSystemMap::ForEach(std::function<bool(TypeSystem *)> const &callback) {
223223
llvm::Expected<TypeSystem &> TypeSystemMap::GetTypeSystemForLanguage(
224224
lldb::LanguageType language,
225225
llvm::Optional<CreateCallback> create_callback) {
226-
llvm::Error error = llvm::Error::success();
227-
assert(!error); // Check the success value when assertions are enabled
228226
std::lock_guard<std::mutex> guard(m_mutex);
229-
if (m_clear_in_progress) {
230-
error = llvm::make_error<llvm::StringError>(
227+
if (m_clear_in_progress)
228+
return llvm::make_error<llvm::StringError>(
231229
"Unable to get TypeSystem because TypeSystemMap is being cleared",
232230
llvm::inconvertibleErrorCode());
233-
} else {
234-
collection::iterator pos = m_map.find(language);
235-
if (pos != m_map.end()) {
236-
auto *type_system = pos->second.get();
237-
if (type_system) {
238-
llvm::consumeError(std::move(error));
239-
return *type_system;
240-
}
241-
error = llvm::make_error<llvm::StringError>(
242-
"TypeSystem for language " +
243-
llvm::StringRef(Language::GetNameForLanguageType(language)) +
244-
" doesn't exist",
245-
llvm::inconvertibleErrorCode());
246-
return std::move(error);
247-
}
248231

249-
for (const auto &pair : m_map) {
250-
if (pair.second && pair.second->SupportsLanguage(language)) {
251-
// Add a new mapping for "language" to point to an already existing
252-
// TypeSystem that supports this language
253-
m_map[language] = pair.second;
254-
if (pair.second.get()) {
255-
llvm::consumeError(std::move(error));
256-
return *pair.second.get();
257-
}
258-
error = llvm::make_error<llvm::StringError>(
259-
"TypeSystem for language " +
260-
llvm::StringRef(Language::GetNameForLanguageType(language)) +
261-
" doesn't exist",
262-
llvm::inconvertibleErrorCode());
263-
return std::move(error);
264-
}
265-
}
232+
collection::iterator pos = m_map.find(language);
233+
if (pos != m_map.end()) {
234+
auto *type_system = pos->second.get();
235+
if (type_system)
236+
return *type_system;
237+
return llvm::make_error<llvm::StringError>(
238+
"TypeSystem for language " +
239+
llvm::StringRef(Language::GetNameForLanguageType(language)) +
240+
" doesn't exist",
241+
llvm::inconvertibleErrorCode());
242+
}
266243

267-
if (!create_callback) {
268-
error = llvm::make_error<llvm::StringError>(
269-
"Unable to find type system for language " +
270-
llvm::StringRef(Language::GetNameForLanguageType(language)),
271-
llvm::inconvertibleErrorCode());
272-
} else {
273-
// Cache even if we get a shared pointer that contains a null type system
274-
// back
275-
TypeSystemSP type_system_sp = (*create_callback)();
276-
m_map[language] = type_system_sp;
277-
if (type_system_sp.get()) {
278-
llvm::consumeError(std::move(error));
279-
return *type_system_sp.get();
280-
}
281-
error = llvm::make_error<llvm::StringError>(
244+
for (const auto &pair : m_map) {
245+
if (pair.second && pair.second->SupportsLanguage(language)) {
246+
// Add a new mapping for "language" to point to an already existing
247+
// TypeSystem that supports this language
248+
m_map[language] = pair.second;
249+
if (pair.second.get())
250+
return *pair.second.get();
251+
return llvm::make_error<llvm::StringError>(
282252
"TypeSystem for language " +
283253
llvm::StringRef(Language::GetNameForLanguageType(language)) +
284254
" doesn't exist",
285255
llvm::inconvertibleErrorCode());
286256
}
287257
}
288258

289-
return std::move(error);
259+
if (!create_callback)
260+
return llvm::make_error<llvm::StringError>(
261+
"Unable to find type system for language " +
262+
llvm::StringRef(Language::GetNameForLanguageType(language)),
263+
llvm::inconvertibleErrorCode());
264+
265+
// Cache even if we get a shared pointer that contains a null type system
266+
// back
267+
TypeSystemSP type_system_sp = (*create_callback)();
268+
m_map[language] = type_system_sp;
269+
if (type_system_sp.get())
270+
return *type_system_sp.get();
271+
return llvm::make_error<llvm::StringError>(
272+
"TypeSystem for language " +
273+
llvm::StringRef(Language::GetNameForLanguageType(language)) +
274+
" doesn't exist",
275+
llvm::inconvertibleErrorCode());
290276
}
291277

292278
llvm::Expected<TypeSystem &>

0 commit comments

Comments
 (0)