summaryrefslogtreecommitdiff
path: root/ssh.c
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2010-10-26 13:00:05 +0100
committerColin Watson <cjwatson@debian.org>2010-10-26 13:00:05 +0100
commit2ff7e453722250e15e681574314a635ac9003f3c (patch)
tree02628fef3072bb8719a4b9e26d7fb44e23c74ff9 /ssh.c
parentd03a9f67f01b5c828ecb9aac1f8b9439e252fc4a (diff)
Backport upstream patch to install a SIGCHLD handler to reap expired ssh
child processes, preventing lots of zombies when using ControlPersist (closes: #594687).
Diffstat (limited to 'ssh.c')
-rw-r--r--ssh.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/ssh.c b/ssh.c
index ab3c33d87..22d4f53c4 100644
--- a/ssh.c
+++ b/ssh.c
@@ -50,6 +50,7 @@
50#include <sys/ioctl.h> 50#include <sys/ioctl.h>
51#include <sys/param.h> 51#include <sys/param.h>
52#include <sys/socket.h> 52#include <sys/socket.h>
53#include <sys/wait.h>
53 54
54#include <ctype.h> 55#include <ctype.h>
55#include <errno.h> 56#include <errno.h>
@@ -210,6 +211,7 @@ usage(void)
210static int ssh_session(void); 211static int ssh_session(void);
211static int ssh_session2(void); 212static int ssh_session2(void);
212static void load_public_identity_files(void); 213static void load_public_identity_files(void);
214static void main_sigchld_handler(int);
213 215
214/* from muxclient.c */ 216/* from muxclient.c */
215void muxclient(const char *); 217void muxclient(const char *);
@@ -849,6 +851,7 @@ main(int ac, char **av)
849 tilde_expand_filename(options.user_hostfile2, original_real_uid); 851 tilde_expand_filename(options.user_hostfile2, original_real_uid);
850 852
851 signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE early */ 853 signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE early */
854 signal(SIGCHLD, main_sigchld_handler);
852 855
853 /* Log into the remote system. Never returns if the login fails. */ 856 /* Log into the remote system. Never returns if the login fails. */
854 ssh_login(&sensitive_data, host, (struct sockaddr *)&hostaddr, 857 ssh_login(&sensitive_data, host, (struct sockaddr *)&hostaddr,
@@ -1532,3 +1535,19 @@ load_public_identity_files(void)
1532 bzero(pwdir, strlen(pwdir)); 1535 bzero(pwdir, strlen(pwdir));
1533 xfree(pwdir); 1536 xfree(pwdir);
1534} 1537}
1538
1539static void
1540main_sigchld_handler(int sig)
1541{
1542 int save_errno = errno;
1543 pid_t pid;
1544 int status;
1545
1546 while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
1547 (pid < 0 && errno == EINTR))
1548 ;
1549
1550 signal(sig, main_sigchld_handler);
1551 errno = save_errno;
1552}
1553