summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibELF
diff options
context:
space:
mode:
authorTim Schumacher <timschumi@gmx.de>2022-10-28 16:30:27 +0200
committerLinus Groh <mail@linusgroh.de>2022-10-31 19:23:02 +0000
commit177a5baf60817f32cfce3dada93461b476371ce2 (patch)
treeb902195e8e99d008bf26617e55e0541434a426af /Userland/Libraries/LibELF
parenta1de15498dac4be02756f01c050e18ac98221c59 (diff)
downloadserenity-177a5baf60817f32cfce3dada93461b476371ce2.zip
LibELF: Ensure that DynamicLoader only receives absolute paths
While at it, start renaming variables where we know that they store a path, so that we will get less confused in the future.
Diffstat (limited to 'Userland/Libraries/LibELF')
-rw-r--r--Userland/Libraries/LibELF/DynamicLinker.cpp20
-rw-r--r--Userland/Libraries/LibELF/DynamicLinker.h2
-rw-r--r--Userland/Libraries/LibELF/DynamicLoader.cpp2
3 files changed, 14 insertions, 10 deletions
diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp
index eaf7e871be..9e83a388f0 100644
--- a/Userland/Libraries/LibELF/DynamicLinker.cpp
+++ b/Userland/Libraries/LibELF/DynamicLinker.cpp
@@ -35,7 +35,7 @@
namespace ELF {
static HashMap<String, NonnullRefPtr<ELF::DynamicLoader>> s_loaders;
-static String s_main_program_name;
+static String s_main_program_path;
static OrderedHashMap<String, NonnullRefPtr<ELF::DynamicObject>> s_global_objects;
using EntryPointFunction = int (*)(int, char**, char**);
@@ -459,7 +459,7 @@ static Result<void*, DlErrorMessage> __dlopen(char const* filename, int flags)
dbgln_if(DYNAMIC_LOAD_DEBUG, "__dlopen invoked, filename={}, flags={}", filename, flags);
- auto library_name = get_library_name(filename ? filename : s_main_program_name);
+ auto library_name = get_library_name(filename ? filename : s_main_program_path);
if (pthread_mutex_trylock(&s_loader_lock) != 0)
return DlErrorMessage { "Nested calls to dlopen() are not permitted." };
@@ -474,7 +474,7 @@ static Result<void*, DlErrorMessage> __dlopen(char const* filename, int flags)
VERIFY(!library_name.is_empty());
- auto const& parent_object = **s_global_objects.get(get_library_name(s_main_program_name));
+ auto const& parent_object = **s_global_objects.get(get_library_name(s_main_program_path));
auto result1 = map_library(filename, parent_object);
if (result1.is_error()) {
@@ -598,21 +598,23 @@ static void read_environment_variables()
}
}
-void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_program_fd, bool is_secure, int argc, char** argv, char** envp)
+void ELF::DynamicLinker::linker_main(String&& main_program_path, int main_program_fd, bool is_secure, int argc, char** argv, char** envp)
{
+ VERIFY(main_program_path.starts_with('/'));
+
s_envp = envp;
s_allowed_to_check_environment_variables = !is_secure;
if (s_allowed_to_check_environment_variables)
read_environment_variables();
- s_main_program_name = main_program_name;
+ s_main_program_path = main_program_path;
- auto library_name = get_library_name(main_program_name);
+ auto library_name = get_library_name(main_program_path);
// NOTE: We always map the main library first, since it may require
// placement at a specific address.
- auto result1 = map_library(main_program_name, main_program_fd, main_program_name);
+ auto result1 = map_library(main_program_path, main_program_fd, main_program_path);
if (result1.is_error()) {
warnln("{}", result1.error().text);
fflush(stderr);
@@ -634,8 +636,8 @@ void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_progra
allocate_tls();
- auto entry_point_function = [&main_program_name] {
- auto library_name = get_library_name(main_program_name);
+ auto entry_point_function = [&main_program_path] {
+ auto library_name = get_library_name(main_program_path);
auto result = link_main_library(library_name, RTLD_GLOBAL | RTLD_LAZY);
if (result.is_error()) {
warnln("{}", result.error().text);
diff --git a/Userland/Libraries/LibELF/DynamicLinker.h b/Userland/Libraries/LibELF/DynamicLinker.h
index a09f18bf5b..9aa256c926 100644
--- a/Userland/Libraries/LibELF/DynamicLinker.h
+++ b/Userland/Libraries/LibELF/DynamicLinker.h
@@ -15,7 +15,7 @@ namespace ELF {
class DynamicLinker {
public:
static Optional<DynamicObject::SymbolLookupResult> lookup_global_symbol(StringView symbol);
- [[noreturn]] static void linker_main(String&& main_program_name, int fd, bool is_secure, int argc, char** argv, char** envp);
+ [[noreturn]] static void linker_main(String&& main_program_path, int fd, bool is_secure, int argc, char** argv, char** envp);
private:
DynamicLinker() = delete;
diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp
index 1e7cd74032..e2babf86ae 100644
--- a/Userland/Libraries/LibELF/DynamicLoader.cpp
+++ b/Userland/Libraries/LibELF/DynamicLoader.cpp
@@ -39,6 +39,8 @@ namespace ELF {
Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(int fd, String filename, String filepath)
{
+ VERIFY(filepath.starts_with('/'));
+
struct stat stat;
if (fstat(fd, &stat) < 0) {
return DlErrorMessage { "DynamicLoader::try_create fstat" };