From a841dacf458636483cb0a12ab4e675ca0b862c2d Mon Sep 17 00:00:00 2001 From: kroening Date: Wed, 4 Jan 2012 20:48:08 +0000 Subject: [PATCH 1/2] Release 4.1 git-svn-id: svn+ssh://svn.cprover.org/srv/svn/cbmc/releases/cbmc-4.1@861 6afb6bc1-c8e4-404c-8f48-9ae832c5b171 From 340e95869884577d6779eb4df4f7cf2bb4245591 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Thu, 16 Jun 2011 01:31:03 +0100 Subject: [PATCH 2/2] bug#105: Proper signal handling and process group killing - Only patched in CBMC, others have lost all signal handling --- src/cbmc/main.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/util/parseoptions.cpp | 4 ---- src/util/signal_catcher.cpp | 11 +++++++++-- src/util/signal_catcher.h | 1 + 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/cbmc/main.cpp b/src/cbmc/main.cpp index 233cd8efcf3..1b848415151 100644 --- a/src/cbmc/main.cpp +++ b/src/cbmc/main.cpp @@ -15,6 +15,10 @@ Author: Daniel Kroening, kroening@kroening.com */ #include "parseoptions.h" +#include + +#include +#include /*******************************************************************\ @@ -30,6 +34,39 @@ Function: main int main(int argc, const char **argv) { +#if defined(_WIN32) cbmc_parseoptionst parseoptions(argc, argv); return parseoptions.main(); +#else + if((argc>1 && 0==strcmp(argv[1],"+nofork")) + /* consider: || getpid() == getpgrp() + * - no signal catcher in this case */) + { + argv[1]=argv[0]; + cbmc_parseoptionst parseoptions(argc-1, argv+1); + return parseoptions.main(); + } + + pid_t child=fork(); + assert(0<=child); + child_pgid=child; + if(0==child) + { + setpgid(0, getpid()); + char ** args=new char*[argc+2]; + args[0]=strdup(argv[0]); + args[1]=strdup("+nofork"); + args[argc+1]=0; + while(--argc>0) + args[argc+1]=strdup(argv[argc]); + execvp(argv[0], args); + perror("Failed to run child"); + assert(0); + } + + install_signal_catcher(); + int exitcode=-1; + waitpid(child, &exitcode, 0); + return WEXITSTATUS(exitcode); +#endif } diff --git a/src/util/parseoptions.cpp b/src/util/parseoptions.cpp index e29fa559b8b..d1a01424f72 100644 --- a/src/util/parseoptions.cpp +++ b/src/util/parseoptions.cpp @@ -17,7 +17,6 @@ Author: Daniel Kroening, kroening@kroening.com #include "cmdline.h" #include "parseoptions.h" -#include "signal_catcher.h" /*******************************************************************\ @@ -97,9 +96,6 @@ int parseoptions_baset::main() help(); return EX_OK; } - - // install signal catcher - install_signal_catcher(); return doit(); } diff --git a/src/util/signal_catcher.cpp b/src/util/signal_catcher.cpp index 0808cd81ed7..1a214f38c8e 100644 --- a/src/util/signal_catcher.cpp +++ b/src/util/signal_catcher.cpp @@ -19,6 +19,8 @@ #include "signal_catcher.h" +pid_t child_pgid; + /*******************************************************************\ Function: install_signal_catcher @@ -40,10 +42,15 @@ void install_signal_catcher() act.sa_handler=signal_catcher; act.sa_flags=0; - sigfillset(&(act.sa_mask)); + sigemptyset(&(act.sa_mask)); // install signal handler + sigaction(SIGHUP, &act, NULL); + sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); + sigaction(SIGALRM, &act, NULL); + sigaction(SIGUSR1, &act, NULL); + sigaction(SIGUSR2, &act, NULL); #endif } @@ -64,7 +71,7 @@ void signal_catcher(int sig) #if defined(_WIN32) #else // kill any children by killing group - killpg(0, sig); + killpg(child_pgid, sig); exit(sig); #endif diff --git a/src/util/signal_catcher.h b/src/util/signal_catcher.h index 9057730ed76..49e803c35d1 100644 --- a/src/util/signal_catcher.h +++ b/src/util/signal_catcher.h @@ -1,2 +1,3 @@ void install_signal_catcher(); void signal_catcher(int sig); +extern pid_t child_pgid;