From 4b19c2885bae85dee45ecfc3cfcd8d503d3f3e23 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 22 Jan 2017 11:52:07 +0000 Subject: [PATCH 1/1] Cope with programs which set SIGCHLD to SIG_IGN. (We assume they don't manipulate SIGCHLD on other threads, which is probably true.) Patch from Marco d'Itri, slightly modified. Closes:#765587. --- debian/changelog | 5 ++++- libauthbind.c | 23 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index f3e2c6b..1356606 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,8 @@ -authbind (2.1.2~~iwj) unstable; urgency=low +authbind (2.1.2) unstable; urgency=low + * Cope with programs which set SIGCHLD to SIG_IGN. (We assume + they don't manipulate SIGCHLD on other threads, which is probably + true.) Patch from Marco d'Itri, slightly modified. Closes:#765587. * Fix one-letter typo in previous changelog entry. -- diff --git a/libauthbind.c b/libauthbind.c index a685ce3..42630e4 100644 --- a/libauthbind.c +++ b/libauthbind.c @@ -146,9 +146,10 @@ int bind(int fd, const struct sockaddr *addr, socklen_t addrlen) { pid_t child, rchild; char portarg[5], addrarg[33]; const char *afarg; - int i, r, status; + int i, r, status, restore_sigchild; const int *evilsignal; sigset_t block, saved; + struct sigaction old_sigchild; unsigned int portval; switch (addr->sa_family) { @@ -195,6 +196,18 @@ int bind(int fd, const struct sockaddr *addr, socklen_t addrlen) { sprintf(portarg,"%04x", portval&0x0ffff); + restore_sigchild= 0; + if (sigaction(SIGCHLD,NULL,&old_sigchild)) return -1; + if (old_sigchild.sa_handler == SIG_IGN) { + struct sigaction new_sigchild; + + new_sigchild.sa_handler= SIG_DFL; + sigemptyset(&new_sigchild.sa_mask); + new_sigchild.sa_flags= 0; + if (sigaction(SIGCHLD,&new_sigchild,&old_sigchild)) return -1; + restore_sigchild= 1; + } + child= fork(); if (child==-1) goto x_err; if (!child) { @@ -228,5 +241,13 @@ x_err: r= -1; x: if (sigprocmask(SIG_SETMASK,&saved,0)) abort(); + if (restore_sigchild) { + if (sigaction(SIGCHLD,&old_sigchild,NULL)) return -1; + if (old_sigchild.sa_handler == SIG_IGN) { + int discard; + while (waitpid(-1, &discard, WNOHANG) > 0) + ; + } + } return r; } -- 2.30.2