summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2014-02-15 21:13:57 +0800
committerMatt Johnston <matt@ucc.asn.au>2014-02-15 21:13:57 +0800
commit44df44c461a418c8068ab7aa55ee03054dd01e14 (patch)
tree7228f031a9dbf8d542611ce85f913b39e69482c8
parent2d32f3fe6b2633ee0ff7ff38187bbd828e48cb83 (diff)
downloaddropbear-44df44c461a418c8068ab7aa55ee03054dd01e14.tar.gz
- Save errno in signal handlers
- Use _exit() in segv handler
-rw-r--r--svr-chansession.c4
-rw-r--r--svr-main.c5
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 */
diff --git a/svr-main.c b/svr-main.c
index 73b281b..4b38594 100644
--- a/svr-main.c
+++ b/svr-main.c
@@ -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 */