Package: socat Version: 1.4.3.1-1 Severity: normal Tags: patch I don't currently know that I'm experiencing any symptom of this, other than a warning generated by what I'm told is an obsolete warning flag to Perl.
mart...@whitewater:~$ perl -we 0 mart...@whitewater:~$ socat - EXEC:'perl -we 0' Can't ignore signal CHLD, forcing to default. mart...@whitewater:~$ Here's a demonstration with a more recent version of socat, unpatched then patched: mart...@whitewater:/tmp/socat-1.7.1.0$ /tmp/socat-1.7.1.0/socat - EXEC:'perl -we 0' Can't ignore signal CHLD, forcing to default. mart...@whitewater:/tmp/socat-1.7.1.0$ patch -p0 < xio-progcall.c.patch patching file xio-progcall.c mart...@whitewater:/tmp/socat-1.7.1.0$ make gcc -O -D_GNU_SOURCE -Wall -Wno-parentheses -DHAVE_CONFIG_H -I. -I. -c -o xio-progcall.o xio-progcall.c ar r libxio.a <snipped> ranlib libxio.a gcc -O -D_GNU_SOURCE -Wall -Wno-parentheses -DHAVE_CONFIG_H -I. -o socat socat.o libxio.a -lutil -lssl mart...@whitewater:/tmp/socat-1.7.1.0$ /tmp/socat-1.7.1.0/socat - EXEC:'perl -we 0' mart...@whitewater:/tmp/socat-1.7.1.0$ I fear there might be other symptoms, which is why I'm raising the bug. My fears are based partly on: In http://www.pasc.org/interps/unofficial/db/p1003.1/pasc-1003.1-132.html, a "David Korn" (perhaps *the* Dave Korn) is quoted as having written: A conforming application would not set SIGCHLD to SIG_IGN since the standard leaves this behavior unspecified. An application that does set SIGCHLD to SIG_IGN should set it back to SIG_DFL before the call to exec. In working on terminal emulators, I've seen a number of programs revert SIGCHLD to SIG_DFL before calling exec(), generally without convincingly specifying the reason. Perhaps the unspecified heritability of SIG_IGN is the reason. I wonder why socat ignores SIGCHLD in the child. Perhaps it's for the case where the child will then call system(). Then the SIG_IGN will affect socat code as well as any child that inherits it. But system() waits for its child. Perhaps this SIG_IGN is a relic of earlier efforts to prevent zombies. More likely, I'm missing something. -- System Information: Debian Release: 4.0 APT prefers oldstable APT policy: (500, 'oldstable'), (50, 'unstable') Architecture: amd64 (x86_64) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.18-4-amd64 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to en_US.UTF-8) Versions of packages socat depends on: ii libc6 2.3.6.ds1-13etch9 GNU C Library: Shared libraries ii libreadline5 5.2-2 GNU readline and history libraries ii libssl0.9.8 0.9.8c-4etch5 SSL shared libraries ii libwrap0 7.6.dbs-13 Wietse Venema's TCP wrappers libra socat recommends no packages. -- no debconf information
--- xio-progcall.c.orig 2009-05-29 12:20:53.000000000 -0700 +++ xio-progcall.c 2009-05-29 12:24:43.000000000 -0700 @@ -414,8 +414,10 @@ gid_t group; if (withfork) { - if (Signal(SIGCHLD, SIG_IGN) == SIG_ERR) { - Warn1("signal(SIGCHLD, SIG_IGN): %s", strerror(errno)); + /* The child should have default handling for SIGCHLD. */ + /* In particular, it's not defined whether ignoring SIGCHLD is inheritable. */ + if (Signal(SIGCHLD, SIG_DFL) == SIG_ERR) { + Warn1("signal(SIGCHLD, SIG_DFL): %s", strerror(errno)); } #if HAVE_PTY