diff options
author | Tim Schumacher <timschumi@gmx.de> | 2022-10-28 19:09:06 +0200 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-10-31 19:23:02 +0000 |
commit | 2f4c06b13b6e4a8c01ea2e9ebfb8c3c7521c3190 (patch) | |
tree | caab7c1d8c66a91dcf722b996f1f526ff5c28a4a /Userland | |
parent | 5e2a14686083843c07a86221d912924097a398ec (diff) | |
download | serenity-2f4c06b13b6e4a8c01ea2e9ebfb8c3c7521c3190.zip |
LibELF: Handle absolute and relative paths for all resolve requests
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibELF/DynamicLinker.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp index ce2d158231..9dbcd68c36 100644 --- a/Userland/Libraries/LibELF/DynamicLinker.cpp +++ b/Userland/Libraries/LibELF/DynamicLinker.cpp @@ -51,6 +51,7 @@ static size_t s_allocated_tls_block_size = 0; static char** s_envp = nullptr; static LibCExitFunction s_libc_exit = nullptr; static __pthread_mutex_t s_loader_lock = __PTHREAD_MUTEX_INITIALIZER; +static String s_cwd; static bool s_allowed_to_check_environment_variables { false }; static bool s_do_breakpoint_trap_before_entry { false }; @@ -109,6 +110,11 @@ static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String c static Optional<String> resolve_library(String const& name, DynamicObject const& parent_object) { + // Absolute and relative (to the current working directory) paths are already considered resolved. + // However, ensure that the returned path is absolute and canonical, so pass it through LexicalPath. + if (name.contains('/')) + return LexicalPath::absolute_path(s_cwd, name); + Vector<StringView> search_paths; // Search RPATH values indicated by the ELF (only if RUNPATH is not present). @@ -138,13 +144,6 @@ static Optional<String> resolve_library(String const& name, DynamicObject const& static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> resolve_and_map_library(String const& name, DynamicObject const& parent_object) { - if (name.contains("/"sv)) { - int fd = open(name.characters(), O_RDONLY); - if (fd < 0) - return DlErrorMessage { String::formatted("Could not open shared library: {}", name) }; - return map_library(name, fd); - } - auto resolved_library_name = resolve_library(name, parent_object); if (!resolved_library_name.has_value()) return DlErrorMessage { String::formatted("Could not find required shared library: {}", name) }; @@ -607,6 +606,10 @@ void ELF::DynamicLinker::linker_main(String&& main_program_path, int main_progra s_envp = envp; + char* raw_current_directory = getcwd(nullptr, 0); + s_cwd = raw_current_directory; + free(raw_current_directory); + s_allowed_to_check_environment_variables = !is_secure; if (s_allowed_to_check_environment_variables) read_environment_variables(); |