#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
extern char end;
const char blabla[] = "blabla";
static void f()
{
char buf[100000];
*buf = 1;
}
static int do_exception(int n)
{
void *_brk, *new_brk;
switch (n) {
case 1:
printf("crashing...\n");
asm volatile ("movb $0, blabla");
break;
case 2:
printf("crashing...\n");
asm volatile ("movb $0, _start");
break;
case 3:
printf("crashing...\n");
asm volatile ("movb $0, 0");
break;
case 4:
_brk = sbrk(0);
new_brk = brk;
if ((unsigned long)new_brk & 0xfff) {
new_brk = (void *)((unsigned long)new_brk & 0xfffff000);
new_brk += 4096;
}
sbrk(new_brk - _brk);
_brk = sbrk(0);
*(char *)(_brk - 1) = '\0';
printf("crashing...\n");
*(char *)_brk = '\0';
break;
case 5:
sbrk(4096);
_brk = sbrk(0);
if ((unsigned long)_brk & 0xfff) {
_brk = (void *)((unsigned long)_brk & 0xfffff000);
_brk += 4096;
}
*(char *)(_brk - 1) = '\0';
printf("crashing...\n");
*(char *)_brk = '\0';
break;
case 6:
printf("crashing...\n");
if (read(0, (void *)(unsigned long)blabla, 1) < 0) {
printf("segmentation fault segfault\n");
_exit(1);
}
break;
case 7:
printf("crashing...\n");
read(0, (void **)f, 1);
break;
default:
return 0;
}
printf("An exception should have occured !\n");
return 1;
}
int main()
{
int n;
int pid;
for (n = 1; n <= 6; n++) {
printf("Test: %d\n", n);
if (!(pid = fork())) {
do_exception(n);
_exit(1);
}
waitpid(pid, NULL, 0);
printf("\n");
}
f();
printf("ok !\n");
return 0;
}