diff --git a/kernel/Makefile b/kernel/Makefile index 38064d7..fb9fa63 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -13,7 +13,7 @@ EXEC_PREFIX?=$(PREFIX) BOOTDIR?=$(EXEC_PREFIX)/boot INCLUDEDIR?=$(PREFIX)/include -CFLAGS:=$(CFLAGS) -ffreestanding -Wall -Wextra +CFLAGS:=$(CFLAGS) -ffreestanding -Wall -Wextra -fstack-protector-all CPPFLAGS:=$(CPPFLAGS) -D__is_kernel -Iinclude LDFLAGS:=$(LDFLAGS) LIBS:=$(LIBS) -nostdlib -lk -lgcc diff --git a/libc/Makefile b/libc/Makefile index 3b72597..4c17a99 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -33,6 +33,8 @@ stdio/printf.o \ stdio/putchar.o \ stdio/puts.o \ stdlib/abort.o \ +stdlib/panic.o \ +stdlib/stack_protection.o \ string/memcmp.o \ string/memcpy.o \ string/memmove.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 106802f..7152640 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -9,6 +9,7 @@ extern "C" { __attribute__((__noreturn__)) void abort(void); +void panic(char *panic_msg); #ifdef __cplusplus } diff --git a/libc/stdlib/abort.c b/libc/stdlib/abort.c index eadba2c..425cede 100644 --- a/libc/stdlib/abort.c +++ b/libc/stdlib/abort.c @@ -5,11 +5,9 @@ __attribute__((__noreturn__)) void abort(void) { #if defined(__is_libk) // TODO: Add proper kernel panic. - printf("kernel: panic: abort()\n"); + panic("abort()\n"); #else // TODO: Abnormally terminate the process as if by SIGABRT. printf("abort()\n"); #endif - while (1) { } - __builtin_unreachable(); } diff --git a/libc/stdlib/panic.c b/libc/stdlib/panic.c new file mode 100644 index 0000000..034697a --- /dev/null +++ b/libc/stdlib/panic.c @@ -0,0 +1,12 @@ +#include +#include + +__attribute__((__noreturn__)) +void panic(char *panic_msg) { +#if defined(__is_libk) + // TODO: Add proper kernel panic. + printf("kernel: panic: %s\n", panic_msg); +#endif + while (1) { } + __builtin_unreachable(); +} diff --git a/libc/stdlib/stack_protection.c b/libc/stdlib/stack_protection.c new file mode 100644 index 0000000..9d5c190 --- /dev/null +++ b/libc/stdlib/stack_protection.c @@ -0,0 +1,20 @@ +#include +#include + +#if UINT32_MAX == UINTPTR_MAX +#define STACK_CHK_GUARD 0xe2dee396 +#else +#define STACK_CHK_GUARD 0x595e9fbd94fda766 +#endif + +uintptr_t __stack_chk_guard = STACK_CHK_GUARD; + +__attribute__((noreturn)) +void __stack_chk_fail(void) +{ +#if __STDC_HOSTED__ + abort(); +#elif __is_myos_kernel + panic("Stack smashing detected"); +#endif +}