]>
Commit | Line | Data |
---|---|---|
1f2f436a A |
1 | /* $OpenBSD: stack_protector.c,v 1.10 2006/03/31 05:34:44 deraadt Exp $ */ |
2 | ||
eb1cde05 A |
3 | /* |
4 | * Copyright (c) 2002 Hiroaki Etoh, Federico G. Schwindt, and Miodrag Vallat. | |
5 | * All rights reserved. | |
6 | * | |
7 | * Redistribution and use in source and binary forms, with or without | |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
10 | * 1. Redistributions of source code must retain the above copyright | |
11 | * notice, this list of conditions and the following disclaimer. | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR | |
17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
19 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, | |
20 | * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
22 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
23 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
24 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | |
25 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | * | |
28 | */ | |
29 | ||
eb1cde05 A |
30 | #include <sys/param.h> |
31 | #include <sys/sysctl.h> | |
1f2f436a A |
32 | #include <signal.h> |
33 | #include <string.h> | |
eb1cde05 | 34 | #include <syslog.h> |
1f2f436a A |
35 | #include <unistd.h> |
36 | ||
37 | extern int __sysctl(int *, u_int, void *, size_t *, void *, size_t); | |
eb1cde05 A |
38 | |
39 | long __guard[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | |
40 | static void __guard_setup(void) __attribute__ ((constructor)); | |
41 | void __stack_smash_handler(char func[], int damaged __attribute__((unused))); | |
42 | ||
43 | static void | |
44 | __guard_setup(void) | |
45 | { | |
1f2f436a A |
46 | int mib[2]; |
47 | size_t len; | |
48 | ||
49 | if (__guard[0] != 0) | |
50 | return; | |
51 | ||
52 | mib[0] = CTL_KERN; | |
53 | mib[1] = KERN_ARND; | |
54 | ||
55 | len = sizeof(__guard); | |
56 | if (__sysctl(mib, 2, __guard, &len, NULL, 0) == -1 || | |
57 | len != sizeof(__guard)) { | |
58 | /* If sysctl was unsuccessful, use the "terminator canary". */ | |
59 | ((unsigned char *)__guard)[0] = 0; | |
60 | ((unsigned char *)__guard)[1] = 0; | |
61 | ((unsigned char *)__guard)[2] = '\n'; | |
62 | ((unsigned char *)__guard)[3] = 255; | |
63 | } | |
eb1cde05 A |
64 | } |
65 | ||
1f2f436a | 66 | /*ARGSUSED*/ |
eb1cde05 A |
67 | void |
68 | __stack_smash_handler(char func[], int damaged) | |
69 | { | |
1f2f436a A |
70 | struct syslog_data sdata = SYSLOG_DATA_INIT; |
71 | const char message[] = "stack overflow in function %s"; | |
72 | struct sigaction sa; | |
73 | sigset_t mask; | |
74 | ||
75 | /* Immediately block all signal handlers from running code */ | |
76 | sigfillset(&mask); | |
77 | sigdelset(&mask, SIGABRT); | |
78 | sigprocmask(SIG_BLOCK, &mask, NULL); | |
eb1cde05 | 79 | |
1f2f436a A |
80 | /* This may fail on a chroot jail... */ |
81 | syslog_r(LOG_CRIT, &sdata, message, func); | |
eb1cde05 | 82 | |
1f2f436a A |
83 | bzero(&sa, sizeof(struct sigaction)); |
84 | sigemptyset(&sa.sa_mask); | |
85 | sa.sa_flags = 0; | |
86 | sa.sa_handler = SIG_DFL; | |
87 | sigaction(SIGABRT, &sa, NULL); | |
eb1cde05 | 88 | |
1f2f436a | 89 | kill(getpid(), SIGABRT); |
eb1cde05 | 90 | |
1f2f436a | 91 | _exit(127); |
eb1cde05 | 92 | } |