diff options
author | Jakob Bornecrantz <jakob@collabora.com> | 2018-11-30 16:33:48 +0000 |
---|---|---|
committer | Jakob Bornecrantz <wallbraker@gmail.com> | 2018-12-11 12:27:01 +0000 |
commit | 84d491ac38437f282ecce2d791833f9fe6a9cf72 (patch) | |
tree | 7c83b8c72a63e05f64207adea6cb4480f6693565 | |
parent | 13d8aaced2984efceeb28653c30fa72836b998e3 (diff) |
vtest: Print segfaults to consolejakob-vtest-print-segfaults
When running tests it's easy to lose track the segfaults in the console spam,
very simply just catch the segfault and printf.
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
-rw-r--r-- | vtest/vtest_server.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/vtest/vtest_server.c b/vtest/vtest_server.c index e714854..e8b6467 100644 --- a/vtest/vtest_server.c +++ b/vtest/vtest_server.c @@ -64,7 +64,8 @@ struct vtest_program prog = { }; static void vtest_main_parse_args(int argc, char **argv); -static void vtest_main_set_signal(void); +static void vtest_main_set_signal_child(void); +static void vtest_main_set_signal_segv(void); static void vtest_main_open_read_file(void); static void vtest_main_open_socket(void); static void vtest_main_run_renderer(int in_fd, int out_fd); @@ -87,7 +88,7 @@ while (__AFL_LOOP(1000)) { } if (prog.do_fork) { - vtest_main_set_signal(); + vtest_main_set_signal_child(); } vtest_main_open_socket(); @@ -98,10 +99,12 @@ start: if (prog.do_fork) { /* fork a renderer process */ if (fork() == 0) { + vtest_main_set_signal_segv(); vtest_main_run_renderer(prog.in_fd, prog.out_fd); exit(0); } } else { + vtest_main_set_signal_segv(); vtest_main_run_renderer(prog.in_fd, prog.out_fd); } @@ -134,18 +137,44 @@ static void vtest_main_parse_args(int argc, char **argv) } } -static void vtest_main_set_signal(void) +static void handler(int sig, siginfo_t *si, void *unused) +{ + (void)sig; (void)si, (void)unused; + + printf("SIGSEGV!\n"); + exit(EXIT_FAILURE); +} + +static void vtest_main_set_signal_child(void) { struct sigaction sa; int ret; - sa.sa_handler = SIG_IGN; + memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); + sa.sa_handler = SIG_IGN; sa.sa_flags = 0; - ret = sigaction(SIGCHLD, &sa, 0); + ret = sigaction(SIGCHLD, &sa, NULL); if (ret == -1) { - perror(NULL); + perror("Failed to set SIGCHLD"); + exit(1); + } +} + +static void vtest_main_set_signal_segv(void) +{ + struct sigaction sa; + int ret; + + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = handler; + + ret = sigaction(SIGSEGV, &sa, NULL); + if (ret == -1) { + perror("Failed to set SIGSEGV"); exit(1); } } |