From: Brian Demsky Date: Thu, 24 May 2012 20:32:55 +0000 (-0700) Subject: wow, this is a nasty bug... X-Git-Tag: pldi2013~392^2~46 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=commitdiff_plain;h=5dccc85bdc3836239c2a8124541074366defb573 wow, this is a nasty bug... the last part of the snapshot bug is the following: we snapshot the user threads stack... when we get a seg fault, the signal handler is using the same write protected stack... obviously this is going to cause problems. luckily there is support for a special stack for the signal handler. this checkin switches the signal handler to run on a different stack than the program stack. --- diff --git a/snapshot.cc b/snapshot.cc index 2098001..7105d2c 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -134,8 +134,15 @@ extern "C" { #endif void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){ #if USE_CHECKPOINTING + /* Setup a stack for our signal handler.... */ + stack_t ss; + ss.ss_sp = MYMALLOC(SIGSTACKSIZE); + ss.ss_size = SIGSTACKSIZE; + ss.ss_flags = 0; + sigaltstack(&ss, NULL); + struct sigaction sa; - sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART; + sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK; sigemptyset( &sa.sa_mask ); sa.sa_sigaction = HandlePF; if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){ diff --git a/snapshot.h b/snapshot.h index 4625c5d..819ea0a 100644 --- a/snapshot.h +++ b/snapshot.h @@ -2,6 +2,8 @@ #define _SNAPSHOT_H #define PAGESIZE 4096 #define USE_CHECKPOINTING 1 +/* Size of signal stack */ +#define SIGSTACKSIZE 16384 typedef unsigned int snapshot_id;