Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Avoid modifying loaded library map while iterating in lib_close() #20941

Merged
merged 3 commits into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 7 additions & 15 deletions src/initialize.cc
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ LibraryInitializer::LibraryInitializer()
LibraryInitializer::~LibraryInitializer() = default;

bool LibraryInitializer::lib_is_loaded(const std::string& path) const {
return loaded_libs.count(path) > 0;
return loaded_libs_.count(path) > 0;
}

/*!
Expand Down Expand Up @@ -139,9 +139,9 @@ void* LibraryInitializer::lib_load(const char* path) {
}
#endif // _WIN32 or _WIN64 or __WINDOWS__
// then store the pointer to the library
loaded_libs[path] = handle;
loaded_libs_[path] = handle;
} else {
handle = loaded_libs.at(path);
handle = loaded_libs_.at(path);
}
return handle;
}
Expand All @@ -150,15 +150,7 @@ void* LibraryInitializer::lib_load(const char* path) {
* \brief Closes the loaded dynamic shared library file
* \param handle library file handle
*/
void LibraryInitializer::lib_close(void* handle) {
std::string libpath;
for (const auto& l : loaded_libs) {
if (l.second == handle) {
libpath = l.first;
break;
}
}
CHECK(!libpath.empty());
void LibraryInitializer::lib_close(void* handle, const std::string& libpath) {
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
FreeLibrary((HMODULE)handle);
#else
Expand All @@ -167,7 +159,6 @@ void LibraryInitializer::lib_close(void* handle) {
<< " loaded from: '" << libpath << "': " << dlerror();
}
#endif // _WIN32 or _WIN64 or __WINDOWS__
loaded_libs.erase(libpath);
}

/*!
Expand Down Expand Up @@ -393,9 +384,10 @@ SIGNAL_HANDLER(SIGBUS, SIGBUSHandler, false);
#endif

void LibraryInitializer::close_open_libs() {
for (const auto& l : loaded_libs) {
lib_close(l.second);
for (const auto& l : loaded_libs_) {
lib_close(l.second, l.first);
}
loaded_libs_.clear();
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/initialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class LibraryInitializer {
// Library loading
bool lib_is_loaded(const std::string& path) const;
void* lib_load(const char* path);
void lib_close(void* handle);
void lib_close(void* handle, const std::string& libpath);
static void get_sym(void* handle, void** func, const char* name);

/**
Expand Down Expand Up @@ -104,7 +104,7 @@ class LibraryInitializer {

void close_open_libs();

loaded_libs_t loaded_libs;
loaded_libs_t loaded_libs_;
};

/*!
Expand Down