- markus@cvs.openbsd.org 2002/03/30 18:51:15
     [monitor.c serverloop.c sftp-int.c sftp.c sshd.c]
     check waitpid for EINTR; based on patch from peter@ifm.liu.se
diff --git a/ChangeLog b/ChangeLog
index edfb450..391eb00 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,6 +19,9 @@
    - stevesk@cvs.openbsd.org 2002/03/29 19:18:33
      [auth-rsa.c ssh-rsa.c ssh.h]
      make RSA modulus minimum #define; ok markus@
+   - markus@cvs.openbsd.org 2002/03/30 18:51:15
+     [monitor.c serverloop.c sftp-int.c sftp.c sshd.c]
+     check waitpid for EINTR; based on patch from peter@ifm.liu.se
 
 20020401
  - (stevesk) [monitor.c] PAM should work again; will *not* work with
@@ -8126,4 +8129,4 @@
  - Wrote replacements for strlcpy and mkdtemp
  - Released 1.0pre1
 
-$Id: ChangeLog,v 1.2012 2002/04/02 20:43:11 mouring Exp $
+$Id: ChangeLog,v 1.2013 2002/04/02 20:48:19 mouring Exp $
diff --git a/monitor.c b/monitor.c
index 7b4e53e..03f8dc7 100644
--- a/monitor.c
+++ b/monitor.c
@@ -25,7 +25,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: monitor.c,v 1.8 2002/03/27 17:45:42 mouring Exp $");
+RCSID("$OpenBSD: monitor.c,v 1.9 2002/03/30 18:51:15 markus Exp $");
 
 #include <openssl/dh.h>
 
@@ -1211,8 +1211,9 @@
 	/* The child is terminating */
 	session_destroy_all(&mm_session_close);
 
-	if (waitpid(monitor->m_pid, &status, 0) == -1)
-		exit(1);
+	while (waitpid(monitor->m_pid, &status, 0) == -1)
+		if (errno != EINTR)
+			exit(1);
 
 	res = WIFEXITED(status) ? WEXITSTATUS(status) : 1;
 
diff --git a/serverloop.c b/serverloop.c
index cacf0ad..38b1cf7 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: serverloop.c,v 1.100 2002/03/24 16:00:27 markus Exp $");
+RCSID("$OpenBSD: serverloop.c,v 1.101 2002/03/30 18:51:15 markus Exp $");
 
 #include "xmalloc.h"
 #include "packet.h"
@@ -670,10 +670,10 @@
 	/* We no longer want our SIGCHLD handler to be called. */
 	mysignal(SIGCHLD, SIG_DFL);
 
-	wait_pid = waitpid(-1, &wait_status, 0);
-	if (wait_pid == -1)
-		packet_disconnect("wait: %.100s", strerror(errno));
-	else if (wait_pid != pid)
+	while ((wait_pid = waitpid(-1, &wait_status, 0)) < 0)
+		if (errno != EINTR)
+			packet_disconnect("wait: %.100s", strerror(errno));
+	if (wait_pid != pid)
 		error("Strange, wait returned pid %d, expected %d",
 		    wait_pid, pid);
 
@@ -723,8 +723,10 @@
 	sigaddset(&nset, SIGCHLD);
 	sigprocmask(SIG_BLOCK, &nset, &oset);
 	if (child_terminated) {
-		while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
-			session_close_by_pid(pid, status);
+		while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
+		    (pid < 0 && errno == EINTR))
+			if (pid > 0)
+				session_close_by_pid(pid, status);
 		child_terminated = 0;
 	}
 	sigprocmask(SIG_SETMASK, &oset, NULL);
diff --git a/sftp-int.c b/sftp-int.c
index 46cbd4a..5b1d384 100644
--- a/sftp-int.c
+++ b/sftp-int.c
@@ -26,7 +26,7 @@
 /* XXX: recursive operations */
 
 #include "includes.h"
-RCSID("$OpenBSD: sftp-int.c,v 1.45 2002/03/19 06:32:56 mpech Exp $");
+RCSID("$OpenBSD: sftp-int.c,v 1.46 2002/03/30 18:51:15 markus Exp $");
 
 #include "buffer.h"
 #include "xmalloc.h"
@@ -176,8 +176,9 @@
 		    strerror(errno));
 		_exit(1);
 	}
-	if (waitpid(pid, &status, 0) == -1)
-		fatal("Couldn't wait for child: %s", strerror(errno));
+	while (waitpid(pid, &status, 0) == -1)
+		if (errno != EINTR)
+			fatal("Couldn't wait for child: %s", strerror(errno));
 	if (!WIFEXITED(status))
 		error("Shell exited abormally");
 	else if (WEXITSTATUS(status))
diff --git a/sftp.c b/sftp.c
index f576ed3..e408654 100644
--- a/sftp.c
+++ b/sftp.c
@@ -24,7 +24,7 @@
 
 #include "includes.h"
 
-RCSID("$OpenBSD: sftp.c,v 1.27 2002/03/19 10:49:35 markus Exp $");
+RCSID("$OpenBSD: sftp.c,v 1.28 2002/03/30 18:51:15 markus Exp $");
 
 /* XXX: short-form remote directory listings (like 'ls -C') */
 
@@ -246,8 +246,10 @@
 	if (infile != stdin)
 		fclose(infile);
 
-	if (waitpid(sshpid, NULL, 0) == -1)
-		fatal("Couldn't wait for ssh process: %s", strerror(errno));
+	while (waitpid(sshpid, NULL, 0) == -1)
+		if (errno != EINTR)
+			fatal("Couldn't wait for ssh process: %s",
+			    strerror(errno));
 
 	exit(0);
 }
diff --git a/sshd.c b/sshd.c
index 541e993..2e21d3d 100644
--- a/sshd.c
+++ b/sshd.c
@@ -42,7 +42,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshd.c,v 1.238 2002/03/23 20:57:26 stevesk Exp $");
+RCSID("$OpenBSD: sshd.c,v 1.239 2002/03/30 18:51:15 markus Exp $");
 
 #include <openssl/dh.h>
 #include <openssl/bn.h>
@@ -276,10 +276,12 @@
 static void
 main_sigchld_handler(int sig)
 {
+	pid_t pid;
 	int save_errno = errno;
 	int status;
 
-	while (waitpid(-1, &status, WNOHANG) > 0)
+	while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
+	    (pid < 0 && errno == EINTR))
 		;
 
 	signal(SIGCHLD, main_sigchld_handler);
@@ -577,8 +579,9 @@
 		monitor_sync(monitor);
 
 		/* Wait for the child's exit status */
-		waitpid(pid, &status, 0);
-
+		while (waitpid(pid, &status, 0) < 0)
+			if (errno != EINTR)
+				break;
 		return (authctxt);
 	} else {
 		/* child */