From 6732fec8b806c3b41ecb96d75c3958bfcee0cf32 Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Fri, 24 Jun 2022 11:12:07 +0200 Subject: [PATCH] LibELF: Warn on self-dlopening libraries while initializing --- Userland/Libraries/LibELF/DynamicLinker.cpp | 10 +++++++++- Userland/Libraries/LibELF/DynamicLoader.cpp | 2 ++ Userland/Libraries/LibELF/DynamicLoader.h | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp index 7f8bf05f65..0120b6df64 100644 --- a/Userland/Libraries/LibELF/DynamicLinker.cpp +++ b/Userland/Libraries/LibELF/DynamicLinker.cpp @@ -299,8 +299,16 @@ static void for_each_unfinished_dependency_of(String const& name, HashTableis_fully_initialized()) + if (loader.value()->is_fully_relocated()) { + if (!loader.value()->is_fully_initialized()) { + // If we are ending up here, that possibly means that this library either dlopens itself or a library that depends + // on it while running its initializers. Assuming that this is the only funny thing that the library does, there is + // a reasonable chance that nothing breaks, so just warn and continue. + dbgln("\033[33mWarning:\033[0m Querying for dependencies of '{}' while running its initializers", name); + } + return; + } if (seen_names.contains(name)) return; diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index 05f2c995e5..40a88cd3b7 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -243,6 +243,8 @@ Result, DlErrorMessage> DynamicLoader::load_stage_3 #endif } + m_fully_relocated = true; + return NonnullRefPtr { *m_dynamic_object }; } diff --git a/Userland/Libraries/LibELF/DynamicLoader.h b/Userland/Libraries/LibELF/DynamicLoader.h index c7bd90d4b5..5f8b72bda3 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.h +++ b/Userland/Libraries/LibELF/DynamicLoader.h @@ -82,6 +82,7 @@ public: DynamicObject const& dynamic_object() const; + bool is_fully_relocated() const { return m_fully_relocated; } bool is_fully_initialized() const { return m_fully_initialized; } private: @@ -161,6 +162,7 @@ private: mutable RefPtr m_cached_dynamic_object; + bool m_fully_relocated { false }; bool m_fully_initialized { false }; };