- 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
*/
#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>
/* 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;
*/
#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"
/* 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);
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);
/* 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"
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))
#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') */
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);
}
*/
#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>
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);
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 */