From: djm@openbsd.org Date: Wed, 26 Jun 2024 23:47:46 +0000 (+0000) Subject: upstream: move child process waitpid() loop out of SIGCHLD handler; X-Git-Tag: V_9_8_P1~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12b6cc09ce6c430681f03af2a8069e37a664690b;p=thirdparty%2Fopenssh-portable.git upstream: move child process waitpid() loop out of SIGCHLD handler; ok deraadt OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741 --- diff --git a/sshd.c b/sshd.c index f8fb69422..3f085b838 100644 --- a/sshd.c +++ b/sshd.c @@ -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) 2002 Niels Provos. All rights reserved. @@ -423,9 +423,25 @@ static void child_reap_all_exited(void) { int i; + pid_t pid; + int status; if (children == NULL) 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++) { if (!children[i].have_status) continue; @@ -515,29 +531,10 @@ siginfo_handler(int sig) } #endif -/* - * SIGCHLD handler. This is called whenever a child dies. This will then - * reap any zombies left by exited children. - */ static void 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; - } - errno = save_errno; + received_sigchld = 1; } /*