From 0ab37dbd039c28f551c1bb22a9ab2948adb73b94 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 10 May 2021 21:00:11 +0200 Subject: [PATCH] LibELF: Propagate ELF image validation errors to the caller With this fixed dlopen() no longer crashes when given an invalid ELF image and instead returns an error code that can be retrieved with dlerror(). Fixes #6995. --- Userland/Libraries/LibELF/DynamicLoader.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index c65f2dd1e0..5c8a7f9be8 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -54,7 +54,10 @@ Result, DlErrorMessage> DynamicLoader::try_create(i return DlErrorMessage { "DynamicLoader::try_create mmap" }; } - return adopt_ref(*new DynamicLoader(fd, move(filename), data, size)); + auto loader = adopt_ref(*new DynamicLoader(fd, move(filename), data, size)); + if (!loader->is_valid()) + return DlErrorMessage { "ELF image validation failed" }; + return loader; } DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size) @@ -64,8 +67,9 @@ DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size) , m_file_data(data) , m_elf_image((u8*)m_file_data, m_file_size) { - m_tls_size_of_current_object = calculate_tls_size(); m_valid = validate(); + if (m_valid) + m_tls_size_of_current_object = calculate_tls_size(); } DynamicLoader::~DynamicLoader()