diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index df7deae852..7829b38e2f 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -994,6 +995,7 @@ void ProcFS::add_sys_string(String&& name, Lockable& var, Function* kmalloc_stack_helper; + static Lockable* ubsan_deadly_helper; if (kmalloc_stack_helper == nullptr) { kmalloc_stack_helper = new Lockable(); @@ -1001,6 +1003,11 @@ bool ProcFS::initialize() ProcFS::add_sys_bool("kmalloc_stacks", *kmalloc_stack_helper, [] { g_dump_kmalloc_stacks = kmalloc_stack_helper->resource(); }); + ubsan_deadly_helper = new Lockable(); + ubsan_deadly_helper->resource() = UBSanitizer::g_ubsan_is_deadly; + ProcFS::add_sys_bool("ubsan_is_deadly", *ubsan_deadly_helper, [] { + UBSanitizer::g_ubsan_is_deadly = ubsan_deadly_helper->resource(); + }); } return true; } diff --git a/Kernel/UBSanitizer.cpp b/Kernel/UBSanitizer.cpp index bdcb37696f..78c0fa05f6 100644 --- a/Kernel/UBSanitizer.cpp +++ b/Kernel/UBSanitizer.cpp @@ -26,22 +26,26 @@ #include #include +#include #include using namespace Kernel; using namespace Kernel::UBSanitizer; +bool Kernel::UBSanitizer::g_ubsan_is_deadly { true }; + extern "C" { static void print_location(const SourceLocation& location) { if (!location.filename()) { dbgln("KUBSAN: in unknown file"); - } else { dbgln("KUBSAN: at {}, line {}, column: {}", location.filename(), location.line(), location.column()); } dump_backtrace(); + if (g_ubsan_is_deadly) + PANIC("UB is configured to be deadly."); } void __ubsan_handle_load_invalid_value(const InvalidValueData&, ValueHandle); diff --git a/Kernel/UBSanitizer.h b/Kernel/UBSanitizer.h index 4031139b63..d91231f8b8 100644 --- a/Kernel/UBSanitizer.h +++ b/Kernel/UBSanitizer.h @@ -30,6 +30,8 @@ namespace Kernel::UBSanitizer { +extern bool g_ubsan_is_deadly; + typedef void* ValueHandle; class SourceLocation {