stack_protector.c revision 180012
1#include <sys/cdefs.h>
2__FBSDID("$FreeBSD: head/sys/kern/stack_protector.c 180012 2008-06-25 21:33:28Z ru $");
3
4#include <sys/types.h>
5#include <sys/param.h>
6#include <sys/kernel.h>
7#include <sys/systm.h>
8#include <sys/libkern.h>
9
10#if defined(__SSP__) || defined(__SSP_ALL__)
11long __stack_chk_guard[8] = {};
12void __stack_chk_fail(void);
13
14void
15__stack_chk_fail(void)
16{
17
18	panic("stack overflow detected; backtrace may be corrupted");
19}
20
21#define __arraycount(__x)	(sizeof(__x) / sizeof(__x[0]))
22static void
23__stack_chk_init(void *dummy __unused)
24{
25	size_t i;
26	long guard[__arraycount(__stack_chk_guard)];
27
28	arc4rand(guard, sizeof(guard), 0);
29	for (i = 0; i < __arraycount(guard); i++)
30		__stack_chk_guard[i] = guard[i];
31}
32/* SI_SUB_EVENTHANDLER is right after SI_SUB_LOCK used by arc4rand() init. */
33SYSINIT(stack_chk, SI_SUB_EVENTHANDLER, SI_ORDER_ANY, __stack_chk_init, NULL);
34
35#endif
36