blob: 2557d928dadbd0856ca51443825696264046e6e4 [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
#define DUMMY_FILE "dummy.txt"
static void sighandler(int sig) {
atomic_printf("caught signal %d, exiting\n", sig);
atomic_puts("EXIT-SUCCESS");
_exit(0);
}
int main(void) {
size_t page_size = sysconf(_SC_PAGESIZE);
int fd = open(DUMMY_FILE, O_CREAT | O_EXCL | O_RDWR, 0600);
int one = 1;
int* rpage;
unlink(DUMMY_FILE);
test_assert(fd >= 0);
test_assert(sizeof(one) == write(fd, &one, sizeof(one)));
rpage = mmap(NULL, page_size * 2, PROT_READ, MAP_PRIVATE, fd, 0);
test_assert(rpage != (void*)-1);
test_assert(*rpage == 1);
signal(SIGSEGV, sighandler);
signal(SIGBUS, sighandler);
/* This should generate a SIGBUS, but the test will pass whether the
kernel generates SIGBUS or SIGSEGV.
rr checks that the same signal is produced during replay
as during recording. */
char ch = *((char*)rpage + page_size);
atomic_printf("FAILED: no segfault, read %d", ch);
return 0;
}