X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/ad3c9f2af814c84582fdd1649e49ec4f68572c5a..fc56b708803d28b949a9181528bb0da4d25b3b7b:/sys/OpenBSD/stack_protector.c diff --git a/sys/OpenBSD/stack_protector.c b/sys/OpenBSD/stack_protector.c index 74976f6..7ac7c7b 100644 --- a/sys/OpenBSD/stack_protector.c +++ b/sys/OpenBSD/stack_protector.c @@ -31,17 +31,20 @@ #include #include #include -#include #include #include #include -#include "CrashReporterClient.h" +#if __has_include() +#include +#else +#define CRSetCrashLogMessage(...) +#endif #include "libproc.h" #include "_simple.h" #define GUARD_MAX 8 long __stack_chk_guard[GUARD_MAX] = {0, 0, 0, 0, 0, 0, 0, 0}; -void __abort(void) __dead2; +void __abort(void) __cold __dead2; void __guard_setup(const char *apple[]) __attribute__ ((visibility ("hidden"))); void __stack_chk_fail(void); @@ -88,8 +91,10 @@ __guard_setup(const char *apple[]) for (p = apple; p && *p; p++) { if (strstr(*p, "stack_guard") == *p) { __guard_from_kernel(*p); - if (__stack_chk_guard[0] != 0) + bzero((void*)*p, strlen(*p)); + if (__stack_chk_guard[0] != 0) { return; + } } } @@ -110,30 +115,18 @@ __guard_setup(const char *apple[]) ((unsigned char *)__stack_chk_guard)[3] = 255; } -#define STACKOVERFLOW "] stack overflow" +static const char *stackoverflow_msg = "stack buffer overflow"; void __stack_chk_fail() { - char n[16]; // bigger than will hold the digits in a pid_t - char *np; - int pid = getpid(); - char message[sizeof(n) + sizeof(STACKOVERFLOW)] = "["; - char prog[2*MAXCOMLEN+1] = {0}; + CRSetCrashLogMessage(stackoverflow_msg); - proc_name(pid, prog, 2*MAXCOMLEN); - prog[2*MAXCOMLEN] = 0; - np = n + sizeof(n); - *--np = 0; - while(pid > 0) { - *--np = (pid % 10) + '0'; - pid /= 10; - } - strlcat(message, np, sizeof(message)); - strlcat(message, STACKOVERFLOW, sizeof(message)); /* This may fail on a chroot jail... */ - _simple_asl_log_prog(ASL_LEVEL_CRIT, "user", message, prog); + char prog[2*MAXCOMLEN+1] = {0}; + proc_name(getpid(), prog, 2*MAXCOMLEN); + prog[2*MAXCOMLEN] = 0; + _simple_asl_log_prog(ASL_LEVEL_CRIT, "user", stackoverflow_msg, prog); - CRSetCrashLogMessage(message); __abort(); }