diff --git a/svr-chansession.c b/svr-chansession.c
index dd9ea02b829458f909acf0291c54376e2bbd4527..63e56a8a8bf21abb441c01440037972f683e82fa 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 73b281baae7f622973c79ed9a65b57f8cd705985..4b385949fabbb9b56843c9a564d385a7dd865a9d 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 */