changeset 893:860e3522f8fc

- Save errno in signal handlers - Use _exit() in segv handler
author Matt Johnston <matt@ucc.asn.au>
date Sat, 15 Feb 2014 21:13:57 +0800
parents ae766a2c8fa7
children 7032deca6b90
files svr-chansession.c svr-main.c
diffstat 2 files changed, 8 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/svr-chansession.c	Fri Feb 14 23:18:45 2014 +0800
+++ b/svr-chansession.c	Sat Feb 15 21:13:57 2014 +0800
@@ -87,6 +87,8 @@
 	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 @@
 	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 */
--- a/svr-main.c	Fri Feb 14 23:18:45 2014 +0800
+++ b/svr-main.c	Sat Feb 15 21:13:57 2014 +0800
@@ -337,6 +337,8 @@
 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 @@
 	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 */