1*8a272653SPeter Holm /*
2*8a272653SPeter Holm * COPYRIGHT (c) 1990 BY *
3*8a272653SPeter Holm * GEORGE J. CARRETTE, CONCORD, MASSACHUSETTS. *
4*8a272653SPeter Holm * ALL RIGHTS RESERVED *
5*8a272653SPeter Holm
6*8a272653SPeter Holm Permission to use, copy, modify, distribute and sell this software
7*8a272653SPeter Holm and its documentation for any purpose and without fee is hereby
8*8a272653SPeter Holm granted, provided that the above copyright notice appear in all copies
9*8a272653SPeter Holm and that both that copyright notice and this permission notice appear
10*8a272653SPeter Holm in supporting documentation, and that the name of the author
11*8a272653SPeter Holm not be used in advertising or publicity pertaining to distribution
12*8a272653SPeter Holm of the software without specific, written prior permission.
13*8a272653SPeter Holm
14*8a272653SPeter Holm THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15*8a272653SPeter Holm ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16*8a272653SPeter Holm HE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17*8a272653SPeter Holm ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18*8a272653SPeter Holm WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19*8a272653SPeter Holm ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20*8a272653SPeter Holm SOFTWARE.
21*8a272653SPeter Holm
22*8a272653SPeter Holm This code is based on crashme.c
23*8a272653SPeter Holm
24*8a272653SPeter Holm */
25*8a272653SPeter Holm
26*8a272653SPeter Holm #include <sys/types.h>
27*8a272653SPeter Holm #include <sys/mman.h>
28*8a272653SPeter Holm #include <sys/param.h>
29*8a272653SPeter Holm #include <sys/resource.h>
30*8a272653SPeter Holm #include <sys/time.h>
31*8a272653SPeter Holm #include <err.h>
32*8a272653SPeter Holm #include <signal.h>
33*8a272653SPeter Holm #include <stdio.h>
34*8a272653SPeter Holm #include <stdlib.h>
35*8a272653SPeter Holm #include <sys/wait.h>
36*8a272653SPeter Holm #include <unistd.h>
37*8a272653SPeter Holm
38*8a272653SPeter Holm #include "stress.h"
39*8a272653SPeter Holm
40*8a272653SPeter Holm static pid_t pid;
41*8a272653SPeter Holm static int failsafe;
42*8a272653SPeter Holm
43*8a272653SPeter Holm static int
tobemangled(void)44*8a272653SPeter Holm tobemangled(void) {
45*8a272653SPeter Holm volatile int i, j;
46*8a272653SPeter Holm
47*8a272653SPeter Holm j = 2;
48*8a272653SPeter Holm for (i = 0; i < 100; i++)
49*8a272653SPeter Holm j = j + 3;
50*8a272653SPeter Holm j = j / 2;
51*8a272653SPeter Holm
52*8a272653SPeter Holm return (j);
53*8a272653SPeter Holm }
54*8a272653SPeter Holm
55*8a272653SPeter Holm static void
mangle(void)56*8a272653SPeter Holm mangle(void) { /* Change one byte in the code */
57*8a272653SPeter Holm int i;
58*8a272653SPeter Holm char *p = (void *)tobemangled;
59*8a272653SPeter Holm
60*8a272653SPeter Holm i = arc4random() % 50;
61*8a272653SPeter Holm p[i] = arc4random() & 0xff;
62*8a272653SPeter Holm }
63*8a272653SPeter Holm
64*8a272653SPeter Holm static void
hand(int i __unused)65*8a272653SPeter Holm hand(int i __unused) { /* handler */
66*8a272653SPeter Holm _exit(1);
67*8a272653SPeter Holm }
68*8a272653SPeter Holm
69*8a272653SPeter Holm static void
ahand(int i __unused)70*8a272653SPeter Holm ahand(int i __unused) { /* alarm handler */
71*8a272653SPeter Holm if (pid != 0) {
72*8a272653SPeter Holm kill(pid, SIGKILL);
73*8a272653SPeter Holm }
74*8a272653SPeter Holm _exit(EXIT_SUCCESS);
75*8a272653SPeter Holm }
76*8a272653SPeter Holm
77*8a272653SPeter Holm int
setup(int nb __unused)78*8a272653SPeter Holm setup(int nb __unused)
79*8a272653SPeter Holm {
80*8a272653SPeter Holm return (0);
81*8a272653SPeter Holm }
82*8a272653SPeter Holm
83*8a272653SPeter Holm void
cleanup(void)84*8a272653SPeter Holm cleanup(void)
85*8a272653SPeter Holm {
86*8a272653SPeter Holm }
87*8a272653SPeter Holm
88*8a272653SPeter Holm int
test(void)89*8a272653SPeter Holm test(void)
90*8a272653SPeter Holm {
91*8a272653SPeter Holm void *st;
92*8a272653SPeter Holm struct rlimit rl;
93*8a272653SPeter Holm
94*8a272653SPeter Holm if (failsafe)
95*8a272653SPeter Holm return (0);
96*8a272653SPeter Holm
97*8a272653SPeter Holm while (done_testing == 0) {
98*8a272653SPeter Holm signal(SIGALRM, ahand);
99*8a272653SPeter Holm alarm(3);
100*8a272653SPeter Holm if ((pid = fork()) == 0) {
101*8a272653SPeter Holm rl.rlim_max = rl.rlim_cur = 0;
102*8a272653SPeter Holm if (setrlimit(RLIMIT_CORE, &rl) == -1)
103*8a272653SPeter Holm warn("setrlimit");
104*8a272653SPeter Holm st = (void *)trunc_page((unsigned long)tobemangled);
105*8a272653SPeter Holm if (mprotect(st, PAGE_SIZE, PROT_WRITE | PROT_READ |
106*8a272653SPeter Holm PROT_EXEC) == -1)
107*8a272653SPeter Holm err(1, "mprotect()");
108*8a272653SPeter Holm
109*8a272653SPeter Holm signal(SIGALRM, hand);
110*8a272653SPeter Holm signal(SIGILL, hand);
111*8a272653SPeter Holm signal(SIGFPE, hand);
112*8a272653SPeter Holm signal(SIGSEGV, hand);
113*8a272653SPeter Holm signal(SIGBUS, hand);
114*8a272653SPeter Holm signal(SIGURG, hand);
115*8a272653SPeter Holm signal(SIGSYS, hand);
116*8a272653SPeter Holm signal(SIGTRAP, hand);
117*8a272653SPeter Holm
118*8a272653SPeter Holm mangle();
119*8a272653SPeter Holm failsafe = 1;
120*8a272653SPeter Holm (void)tobemangled();
121*8a272653SPeter Holm
122*8a272653SPeter Holm _exit(EXIT_SUCCESS);
123*8a272653SPeter Holm
124*8a272653SPeter Holm } else if (pid > 0) {
125*8a272653SPeter Holm if (waitpid(pid, NULL, 0) == -1)
126*8a272653SPeter Holm warn("waitpid(%d)", pid);
127*8a272653SPeter Holm alarm(0);
128*8a272653SPeter Holm } else
129*8a272653SPeter Holm err(1, "fork(), %s:%d", __FILE__, __LINE__);
130*8a272653SPeter Holm }
131*8a272653SPeter Holm
132*8a272653SPeter Holm return (0);
133*8a272653SPeter Holm }
134