upstream: move child process waitpid() loop out of SIGCHLD handler;

ok deraadt

OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741
This commit is contained in:
djm@openbsd.org 2024-06-26 23:47:46 +00:00 committed by Damien Miller
parent d6bcd13297
commit 12b6cc09ce
No known key found for this signature in database

37
sshd.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: sshd.c,v 1.607 2024/06/06 19:50:01 djm Exp $ */ /* $OpenBSD: sshd.c,v 1.608 2024/06/26 23:47:46 djm Exp $ */
/* /*
* Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved.
* Copyright (c) 2002 Niels Provos. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved.
@ -423,9 +423,25 @@ static void
child_reap_all_exited(void) child_reap_all_exited(void)
{ {
int i; int i;
pid_t pid;
int status;
if (children == NULL) if (children == NULL)
return; return;
for (;;) {
if ((pid = waitpid(-1, &status, WNOHANG)) == 0)
break;
else if (pid == -1) {
if (errno == EINTR || errno == EAGAIN)
continue;
if (errno != ECHILD)
error_f("waitpid: %s", strerror(errno));
break;
}
child_exit(pid, status);
}
for (i = 0; i < options.max_startups; i++) { for (i = 0; i < options.max_startups; i++) {
if (!children[i].have_status) if (!children[i].have_status)
continue; continue;
@ -515,30 +531,11 @@ siginfo_handler(int sig)
} }
#endif #endif
/*
* SIGCHLD handler. This is called whenever a child dies. This will then
* reap any zombies left by exited children.
*/
static void static void
main_sigchld_handler(int sig) main_sigchld_handler(int sig)
{ {
int save_errno = errno;
pid_t pid;
int status;
for (;;) {
if ((pid = waitpid(-1, &status, WNOHANG)) == 0)
break;
else if (pid == -1) {
if (errno == EINTR)
continue;
break;
}
child_exit(pid, status);
received_sigchld = 1; received_sigchld = 1;
} }
errno = save_errno;
}
/* /*
* returns 1 if connection should be dropped, 0 otherwise. * returns 1 if connection should be dropped, 0 otherwise.