Loading...
sys/OpenBSD/stack_protector.c Libc-1725.40.4 Libc-1158.1.2
--- Libc/Libc-1725.40.4/sys/OpenBSD/stack_protector.c
+++ Libc/Libc-1158.1.2/sys/OpenBSD/stack_protector.c
@@ -31,20 +31,17 @@
 #include <signal.h>
 #include <string.h>
 #include <stdlib.h>
+#include <asl.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <fcntl.h>
-#if __has_include(<CrashReporterClient.h>)
 #include <CrashReporterClient.h>
-#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) __cold __dead2;
+void __abort(void) __dead2;
 void __guard_setup(const char *apple[]) __attribute__ ((visibility ("hidden")));
 void __stack_chk_fail(void);
 
@@ -115,18 +112,30 @@
 	((unsigned char *)__stack_chk_guard)[3] = 255;
 }
 
-static const char *stackoverflow_msg = "stack buffer overflow";
+#define STACKOVERFLOW	"] stack overflow"
 
 void
-__stack_chk_fail(void)
+__stack_chk_fail()
 {
-	CRSetCrashLogMessage(stackoverflow_msg);
+	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};
 
+	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... */
-	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);
+	_simple_asl_log_prog(ASL_LEVEL_CRIT, "user", message, prog);
 
+	CRSetCrashLogMessage(message);
 	__abort();
 }