From a5a62f99c54aae004357bc12b8b12c6086d12903 Mon Sep 17 00:00:00 2001 From: Peter Bindels Date: Fri, 16 Jul 2021 23:30:01 +0200 Subject: [PATCH] LibC: Use 64-bit stack smash value for 64-bit mode Otherwise it'll use the first 32 bits that happen to come after, leading to very weird bugs. Fixes #8601 --- Kernel/init.cpp | 6 +++--- Userland/Libraries/LibC/crt0.cpp | 4 ++-- Userland/Libraries/LibC/ssp.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Kernel/init.cpp b/Kernel/init.cpp index a0ba15cc13..7e47b916d4 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -64,8 +64,8 @@ extern ctor_func_t end_heap_ctors; extern ctor_func_t start_ctors; extern ctor_func_t end_ctors; -extern u32 __stack_chk_guard; -u32 __stack_chk_guard; +extern size_t __stack_chk_guard; +size_t __stack_chk_guard; extern "C" u8* start_of_safemem_text; extern "C" u8* end_of_safemem_text; @@ -147,7 +147,7 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init() // Initialize TimeManagement before using randomness! TimeManagement::initialize(0); - __stack_chk_guard = get_fast_random(); + __stack_chk_guard = get_fast_random(); ProcFSComponentRegistry::initialize(); Thread::initialize(); diff --git a/Userland/Libraries/LibC/crt0.cpp b/Userland/Libraries/LibC/crt0.cpp index f496dba46e..00c900e43c 100644 --- a/Userland/Libraries/LibC/crt0.cpp +++ b/Userland/Libraries/LibC/crt0.cpp @@ -14,7 +14,7 @@ #ifndef _DYNAMIC_LOADER extern "C" { -extern u32 __stack_chk_guard; +extern size_t __stack_chk_guard; int main(int, char**, char**); @@ -31,7 +31,7 @@ NAKED void _start(int, char**, char**) int _entry(int argc, char** argv, char** env) { - u32 original_stack_chk = __stack_chk_guard; + size_t original_stack_chk = __stack_chk_guard; arc4random_buf(&__stack_chk_guard, sizeof(__stack_chk_guard)); if (__stack_chk_guard == 0) diff --git a/Userland/Libraries/LibC/ssp.cpp b/Userland/Libraries/LibC/ssp.cpp index dbc108bd6e..434cde286d 100644 --- a/Userland/Libraries/LibC/ssp.cpp +++ b/Userland/Libraries/LibC/ssp.cpp @@ -17,8 +17,8 @@ extern "C" { -extern u32 __stack_chk_guard; -u32 __stack_chk_guard = (u32)0xc6c7c8c9; +extern size_t __stack_chk_guard; +size_t __stack_chk_guard = (size_t)0xc6c7c8c9; __attribute__((noreturn)) void __stack_chk_fail() {