From df7ddfb8035ed133e01edb3ed3aba0cf2088e8b0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 2 Feb 2021 19:59:15 +0100 Subject: [PATCH] LibELF: Mark libc.so and libpthread.so as syscall regions Also, before calling the main program entry function, inform the kernel that no more syscall regions can be registered. This effectively bans syscalls from everywhere except LibC and LibPthread. Pretty neat! :^) --- Userland/Libraries/LibELF/DynamicLinker.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp index f3273ea87c2..746adbc3ee4 100644 --- a/Userland/Libraries/LibELF/DynamicLinker.cpp +++ b/Userland/Libraries/LibELF/DynamicLinker.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -214,6 +215,14 @@ static NonnullRefPtr commit_elf(const String& name) auto object = loader->load_stage_3(RTLD_GLOBAL | RTLD_LAZY, g_total_tls_size); ASSERT(object); + + + if (name.is_one_of("libc.so", "libpthread.so")) { + if (syscall(SC_msyscall, object->base_address().as_ptr())) { + ASSERT_NOT_REACHED(); + } + } + if (name == "libc.so") { initialize_libc(*object); } @@ -263,7 +272,13 @@ void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_progra if (g_do_breakpoint_trap_before_entry) { asm("int3"); } - int rc = main_function(argc, argv, envp); + + int rc = syscall(SC_msyscall, nullptr); + if (rc < 0) { + ASSERT_NOT_REACHED(); + } + + rc = main_function(argc, argv, envp); dbgln("rc: {}", rc); if (g_libc_exit != nullptr) { g_libc_exit(rc);