diff options
author | Matt Johnston <matt@ucc.asn.au> | 2014-02-15 21:13:57 +0800 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2014-02-15 21:13:57 +0800 |
commit | 44df44c461a418c8068ab7aa55ee03054dd01e14 (patch) | |
tree | 7228f031a9dbf8d542611ce85f913b39e69482c8 | |
parent | 2d32f3fe6b2633ee0ff7ff38187bbd828e48cb83 (diff) | |
download | dropbear-44df44c461a418c8068ab7aa55ee03054dd01e14.tar.gz |
- Save errno in signal handlers
- Use _exit() in segv handler
-rw-r--r-- | svr-chansession.c | 4 | ||||
-rw-r--r-- | svr-main.c | 5 |
2 files changed, 8 insertions, 1 deletions
diff --git a/svr-chansession.c b/svr-chansession.c index dd9ea02..63e56a8 100644 --- a/svr-chansession.c +++ b/svr-chansession.c @@ -87,6 +87,8 @@ static void sesssigchild_handler(int UNUSED(dummy)) { struct sigaction sa_chld; struct exitinfo *exit = NULL; + const int saved_errno = errno; + TRACE(("enter sigchld handler")) while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { TRACE(("sigchld handler: pid %d", pid)) @@ -140,6 +142,8 @@ static void sesssigchild_handler(int UNUSED(dummy)) { sigemptyset(&sa_chld.sa_mask); sigaction(SIGCHLD, &sa_chld, NULL); TRACE(("leave sigchld handler")) + + errno = saved_errno; } /* send the exit status or the signal causing termination for a session */ @@ -337,6 +337,8 @@ out: static void sigchld_handler(int UNUSED(unused)) { struct sigaction sa_chld; + const int saved_errno = errno; + while(waitpid(-1, NULL, WNOHANG) > 0); sa_chld.sa_handler = sigchld_handler; @@ -344,13 +346,14 @@ static void sigchld_handler(int UNUSED(unused)) { if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { dropbear_exit("signal() error"); } + errno = saved_errno; } /* catch any segvs */ static void sigsegv_handler(int UNUSED(unused)) { fprintf(stderr, "Aiee, segfault! You should probably report " "this as a bug to the developer\n"); - exit(EXIT_FAILURE); + _exit(EXIT_FAILURE); } /* catch ctrl-c or sigterm */ |