From 910b5116f48294de9ccff56ba34688330f619d5d Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 16 Apr 2019 23:39:52 -0700 Subject: [PATCH] Fix stack overruns --- src/kernel/boot.s | 2 +- src/kernel/interrupts.cpp | 32 ++++++++++--------- src/libraries/kutil/include/kutil/logger.h | 2 +- .../kutil/include/kutil/slab_allocator.h | 2 +- src/libraries/kutil/logger.cpp | 4 +-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/kernel/boot.s b/src/kernel/boot.s index 7b9ae17..2fbc4da 100644 --- a/src/kernel/boot.s +++ b/src/kernel/boot.s @@ -48,7 +48,7 @@ interrupts_disable: section .bss align 0x100 idle_stack_begin: - resb 0x1000 ; 4KiB stack space + resb 0x4000 ; 16KiB stack space global idle_stack_end idle_stack_end: diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 3677bb8..c71225a 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -184,22 +184,24 @@ isr_handler(cpu_state *regs) uintptr_t cr2 = 0; __asm__ __volatile__ ("mov %%cr2, %0" : "=r"(cr2)); - if (!page_manager::get()->fault_handler(cr2)) { - cons->set_color(11); - cons->puts("\nPage Fault:\n"); - cons->set_color(); + if ((regs->errorcode & 0x9) == 0 && + page_manager::get()->fault_handler(cr2)) + break; - cons->puts(" flags:"); - if (regs->errorcode & 0x01) cons->puts(" present"); - if (regs->errorcode & 0x02) cons->puts(" write"); - if (regs->errorcode & 0x04) cons->puts(" user"); - if (regs->errorcode & 0x08) cons->puts(" reserved"); - if (regs->errorcode & 0x10) cons->puts(" ip"); - cons->puts("\n"); - print_regs(*regs); - print_stacktrace(2); - _halt(); - } + cons->set_color(11); + cons->puts("\nPage Fault:\n"); + cons->set_color(); + + cons->puts(" flags:"); + if (regs->errorcode & 0x01) cons->puts(" present"); + if (regs->errorcode & 0x02) cons->puts(" write"); + if (regs->errorcode & 0x04) cons->puts(" user"); + if (regs->errorcode & 0x08) cons->puts(" reserved"); + if (regs->errorcode & 0x10) cons->puts(" ip"); + cons->puts("\n"); + print_regs(*regs); + print_stacktrace(2); + _halt(); } break; diff --git a/src/libraries/kutil/include/kutil/logger.h b/src/libraries/kutil/include/kutil/logger.h index 56baee6..bf54e04 100644 --- a/src/libraries/kutil/include/kutil/logger.h +++ b/src/libraries/kutil/include/kutil/logger.h @@ -110,7 +110,7 @@ void fatal(area_t area, const char *fmt, ...); } // namespace log namespace logs { -#define LOG(name, lvl) extern log::area_t name; +#define LOG(name, lvl) extern const log::area_t name; #include "log_areas.inc" #undef LOG } // namespace logs diff --git a/src/libraries/kutil/include/kutil/slab_allocator.h b/src/libraries/kutil/include/kutil/slab_allocator.h index 59f5ee0..df25306 100644 --- a/src/libraries/kutil/include/kutil/slab_allocator.h +++ b/src/libraries/kutil/include/kutil/slab_allocator.h @@ -29,7 +29,7 @@ public: /// \returns An allocated element inline item_type * pop() { - if (this->empty()) allocate(); + if (this->empty()) this->allocate(); kassert(!this->empty(), "Slab allocator is empty after allocate()"); item_type *item = this->pop_front(); kutil::memset(item, 0, sizeof(item_type)); diff --git a/src/libraries/kutil/logger.cpp b/src/libraries/kutil/logger.cpp index aa2a968..428c3fd 100644 --- a/src/libraries/kutil/logger.cpp +++ b/src/libraries/kutil/logger.cpp @@ -7,7 +7,7 @@ namespace kutil { namespace logs { #define LOG(name, lvl) \ - log::area_t name = #name ## _h; \ + const log::area_t name = #name ## _h; \ const char * name ## _name = #name; #include "log_areas.inc" #undef LOG @@ -19,7 +19,7 @@ using kutil::memset; using kutil::memcpy; logger *logger::s_log = nullptr; -const char *logger::s_level_names[] = {"", "debug", " info", " warn", "error", "fatal"}; +const char *logger::s_level_names[] = {"", "debug", "info", "warn", "error", "fatal"}; logger::logger() : m_buffer(nullptr, 0),